【发布时间】:2019-10-30 02:06:33
【问题描述】:
我正在使用 express 框架开发 Nuxt 服务器端呈现的应用程序。对于身份验证,我使用的是 openid-client 包。现在我想将检索到的令牌存储在快速会话中,但请求模型 (req) 在回调承诺中始终未定义。为此,我想使用 req.session.token = tokenSet.access_token。我是 JavaScript 的新手,所以我认为我遗漏了一些明显的东西。
我尝试了各种关于如何将变量传递到 JavaScript Promise 中的选项,但所有这些都需要您自己定义 Promise,这不是我的情况。我也尝试等待承诺并在回调承诺之外使用它,但也没有成功。
router.get('/api/oidc-callback', (req, res, params) => {
Issuer.discover('http://localhost:5000') // => Promise
.then(function(identityIssuer) {
const client = new identityIssuer.Client({
...
})
// HERE IT IS DEFINED
console.log(req)
client
.callback('http://localhost:3000/api/oidc-callback', req.query, {
code_verifier
})
// => Promise
.then(function(tokenSet) {
// HERE IT IS UNDEFINED
console.log(req)
req.session.token = tokenSet.access_token
}, req)
.catch(error => {
console.log(error)
})
//Also tried using outside
res.redirect('/oidc-callback')
})
})
提前感谢您的帮助!
【问题讨论】:
-
它并没有消失,并且在 then() 的范围内,所以看起来更像是您误解了问题
-
我相信
req未定义的原因是因为promise 在中间件(res, req, next) =>{...}执行后解决了。尝试返回顶级承诺,即(res, req, next) =>{ return Issuer.discover(...)},还在client.callback(..)之前添加return语句。让我知道它有效。 -
你需要从内部then的参数列表中删除
, req。只有错误处理程序(函数)应出现在该位置。可能无法解决问题,但不会造成伤害。 -
@macphilips 添加返回语句有效,现在更有意义了!谢谢
-
@nils168 不客气。我将提取我的评论作为这个问题的答案,并接受它作为正确答案
标签: javascript express promise callback