在函数调用中不保存会话

Sessions not saving inside function call

本文关键字:保存 会话 函数调用      更新时间:2023-09-26

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

这是怎么回事?

你想要访问一个Async操作的会话值,这个操作在你返回你的视图时还没有完成。试一试:

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。