快速会话无法保存

时间:2019-02-26 09:08:29

标签: node.js session shopify express-session

我正在为Shopify的小型应用程序编写一个简单的服务器。获取应用程序的令牌后,我想将其保存到会话中,因此我使用了express-session。但是它没有用。

我在下面的代码中尝试过this解决方案。

github上的家伙也有这个问题:

https://github.com/expressjs/session/issues/371

https://github.com/expressjs/session/issues/633

这是我的配置

app.use(session({ 
    secret: 'new app',
    resave: false,
    saveUninitialized: true,
    cookie: {maxAge: 24*60*60*1000}
}))

这是获取令牌并保存的代码:

request.post(accessTokenRequestUrl, { json: accessTokenPayload })
        .then((accessTokenResponse) => {
            const accessToken = accessTokenResponse.access_token;
            const shopRequestUrl = 'https://' + shop + '/admin/themes.json';
            const shopRequestHeaders = {
                'X-Shopify-Access-Token': accessToken,
            };

            request.get(shopRequestUrl, {headers: shopRequestHeaders})
            .then((shopRes) => {
                let shopObj = JSON.parse(shopRes)
                let themeId = shopObj.themes[0].id;


                req.session.token = accessToken;
                req.session.save();
                console.log(req.session);

                res.json({
                    themeId: themeId,
                    token: accessToken
                })
            })

        })

此后,我的console.log。我说我在会话对象中有令牌:

Session {
  cookie:
   { path: '/',
     _expires: 2019-02-27T09:01:18.638Z,
     originalMaxAge: 86400000,
     httpOnly: true },
  token: '1354658af88b9417d3c268dd3c22eae4' }

但是在另一条路线中:

app.get('/shopify/callback/images', (req, res) => {
    console.log(req.session);
    res.send(req.session.token);
})

我明白了

Session {
  cookie:
   { path: '/',
     _expires: 2019-02-27T09:03:56.280Z,
     originalMaxAge: 86400000,
     httpOnly: true } }

非常感谢您!

1 个答案:

答案 0 :(得分:0)

首先,如果Promise中有任何异步作业,则应始终返回Promise。

return request.get(shopRequestUrl, {headers: shopRequestHeaders})

此外,最好的做法是始终在Promises链中添加.catch()

但是这里真正的问题是req.session.save()是异步的,并具有回调函数。

req.session.token = accessToken;
req.session.save(() => {
  console.log(req.session);

  return res.json({
    themeId : themeId,
    token   : accessToken,
  });
});