JS Promise 解析对象

JS Promise resolve object

以下方法验证 JWT 和 returns id 和过期时间。

verify(token, secret = "jwtSecret") {
    console.log("verify jwt: ", secret);
    return new Promise(function (resolve, reject) {
        jwt.verify(
            token,
            _.get(strapi.plugins, ['users-permissions', 'config', secret]),
            {},
            function (err, tokenPayload = {}) {
                if (err) {
                    return reject(new Error('Invalid token.'));
                }
                console.log(tokenPayload);
                resolve(tokenPayload);
            }
        );
    });
},

当我调用 verify 时,我希望 return 以下对象

Promise { { id: 77, iat: 1593603153, exp: 1596195153 } }

但是我无法访问对象的 ID。

当我执行 console.log("user id: ", payload.id) 时,payload.id 在控制台中显示为 undefined

async refreshToken(ctx) {
    const { token } = ctx.request.body;
    const payload = strapi.plugins['users-permissions'].services.jwt.verify(token, "jwtRefreshSec");
    console.log("auth: ", payload); // this log ->  Promise { { id: 77, iat: 1593603153, exp: 1596195153 } } 
    console.log("user id: ", payload.id); // this log -> undefined
    return data;

},

正如 Andreas 所建议的,最好回顾一下 promises 是如何工作的。

来自 MDN:

The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

A Promise is a proxy for a value not necessarily known when the promise is created.

在您的第一种情况 (console.log("auth: ", payload);) 中,console.log 函数知道它应该在收到承诺后打印它的值。

在第二种情况下,(console.log("user id: ", payload.id);),当您尝试访问结果的 ID 属性 时,承诺尚未解决。

有两种方法可以解决这个问题。

方法一:使用 then

refreshToken(ctx) {
    const { token } = ctx.request.body;
    const payload = strapi.plugins['users-permissions'].services.jwt.verify(token, "jwtRefreshSec")
        .then(payload => {
            console.log("auth: ", payload); // this log ->  { id: 77, iat: 1593603153, exp: 1596195153 }
            console.log("user id: ", payload.id); // this log -> 77
            return data;
        });
   
},

方法二:ES2017Aysnc/Await

async refreshToken(ctx) {
    const { token } = ctx.request.body;
    const payload = await strapi.plugins['users-permissions'].services.jwt.verify(token, "jwtRefreshSec");
    // Will wait for promise to resolve before continuing with await above
    console.log("auth: ", payload); // this log ->  { id: 77, iat: 1593603153, exp: 1596195153 }
    console.log("user id: ", payload.id); // this log -> 77
    return data;

},