没有保存在函数调用内的会话

时间:2016-06-28 20:28:42

标签: javascript node.js sails.js

在我的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语句之外注销会话,则它是未定义的。

这里发生了什么?

1 个答案:

答案 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。