node.js - 快速会话不保存
问题描述
我正在为 Shopify 的一个小应用程序编写一个简单的服务器。在获得我的应用程序的令牌后,我想将其保存到会话中,所以我使用了express-session
. 然而它没有用。
我在下面的代码中尝试了这个解决方案。
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 } }
太感谢了!
解决方案
首先,如果其中有任何异步作业,Promise 应该始终返回一个 Promise。
return request.get(shopRequestUrl, {headers: shopRequestHeaders})
另外,最好总是.catch()
在 Promise 链中添加一个。
但这里真正的问题是req.session.save()是异步的并且需要一个回调函数。
req.session.token = accessToken;
req.session.save(() => {
console.log(req.session);
return res.json({
themeId : themeId,
token : accessToken,
});
});
推荐阅读
- python - 查找数据框的累积回报
- hibernate - Apache Phoenix 的 Spring 数据源
- java - 为项目、项目阶段和阶段模板保持状态(TO_DO、IN_PROGRESS、DONE)的最佳方式是什么
- angular - 垫旋转器未显示
- javascript - 用于 jquery 的 Play 商店应用程序详细信息
- alibaba-cloud - 我们如何使用自定义 SQL 从外部数据库中将数据拉到阿里巴巴 Quick BI 中?
- c# - 将数据从命令行传送到 C# 控制台应用程序
- java - 将对象添加到 piorityQueue 出现问题,我在这里做错了什么?
- angularjs - 从指令触发 ng-submit
- html - 无限自动滚动img html分辨率