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;
},
以下方法验证 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;
},