基于 fetch 与 Node.js 的 cookies 持久化
前端:React Native
后端: Node.js
在实现用户登录态维护时,发现前端在登录成功后得到的登录态信息,在模拟器重开或杀死应用后,无法实现预期的持久化存储。
初步先排查前端封装的 fetch
模块,但由于已正确设置 credentials
,故问题出错点不在前端。
后端,使用的是 express-session
方法,设置了 maxAge
,但没有设置 expires
,在查阅 express-session
的 README
时,发现没有设置 expires
可能是个潜在的出错点。以下为官方API文档的内容链接。
在设置好 expires
后,不管是重开模拟器还是杀死应用,用户的登录态性能能持久化保存,故问题解决。
但出错的具体原因,仍在研究与学习,后续跟进。
最终实现
关于对 fetch
的具体使用方法,可点击以下链接跳转。
// request.js// React Native 网络模块的封装const request = (url, method, body) => { let isOk; // 使用了 Prmosise 的构造函数模式,有点违背 Promise 的设计原则 // 待日后调整,现在先将就使用 return new Promise((resolve, reject) => { fetch(url, { // 前端持久化 cookies 的关键 // 同域请求使用 same-origin // 跨域请求使用 include credentials: "same-origin", method, headers: { Accept: "application/json", "Content-Type": "application/json;charset=utf-8" }, // 注意这里需要使用 strigify 方法 body: JSON.stringify(body) }) .then(response => { isOk = response.ok; return response.json(); }) .then(responseData => { if (isOk) { resolve(responseData); } else { reject(responseData); } }) .catch(error => { reject(error); }); });};export default request;// express-session 的设置app.use({ secret: "sessionSignedSecret", saveUninitialized: false, resave: false, // 设置 maxAge // 注意时间值均以毫秒为单位 maxAge: 2592000000, // 设置 expires expires: new Date(new Date.now() + 2592000000)})复制代码