在我的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个会话,accessToken和endpointUri。
accessToken
会话保存得很好,我可以从其他控制器访问它,但我的endpointUri
无法保存。
我已经测试了该函数,并且正在返回resp,如果我在else语句中设置它后直接注销会话就可以了。
如果我尝试在else语句之外注销会话,则它是未定义的。
这里发生了什么?
答案 0 :(得分:2)
您希望在返回视图时访问未完成的异步操作上的会话值。尝试:
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。