基于 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)
})