在我的 AuthController 中,我正在执行以下操作:
request.post({url: 'https://graph.api.smartthings.com/oauth/token', form: authData} , function(err, resp, body){
info = JSON.parse(body);
req.session.accessToken = info.access_token;
getEndpoint(req.session.accessToken, function(err, resp) {
if(err) {
//TODO: Handle error
console.log(err);
} else {
req.session.endpointUri = resp;
}
});
console.log("endpoint " + req.session.endpointUri);
res.view('test', {
accessToken: req.session.accessToken,
});
});
如您所见,我正在尝试设置 2 个 session :accessToken 和 endpointUri。
accessToken
session 保存得很好,我可以从其他 Controller 访问它,但是我的 endpointUri
没有保存。
我已经测试了该函数并且正在返回 resp,如果我在 else 语句中设置它后直接注销 session ,它就可以工作。
如果我尝试在 else 语句之外注销 session ,则它是未定义的。
这里发生了什么?
最佳答案
您想要访问异步操作的 session 值,该操作在您返回 View 时尚未完成。尝试:
request.post({url: 'https://graph.api.smartthings.com/oauth/token', form: authData} , function(err, resp, body){
info = JSON.parse(body);
req.session.accessToken = info.access_token;
getEndpoint(req.session.accessToken, function(err, resp) {
if(err) {
//TODO: Handle error
console.log(err);
} else {
req.session.endpointUri = resp;
console.log("endpoint " + req.session.endpointUri);
res.view('test', {
accessToken: req.session.accessToken,
});
}
});
});
顺便说一句,这种使用嵌套回调不是一个好的模式,请尝试使用 bluebird 库或 asyncawait。
关于javascript - session 不保存在函数调用内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38085721/