javascript - Express-session 会在一段时间后停止保存会话
问题描述
我有一个相当难以捉摸的问题,即 express 在大约一天的正常运行时间后停止将会话数据保存在会话存储 (MongoDB) 或客户端 cookie 中。重新启动服务器端 API 服务器似乎可以解决问题,但只是再过一天左右,然后它再次发生并且必须再次重新启动。
节点应用程序在 Ubuntu 16 上运行,我找不到与该问题相关的任何日志消息。
我将在下面粘贴设置会话数据的登录代码,
router.post('/login', async function(req, res) {
var user_name = req.body.user_name;
var password = req.body.password;
var currentTime = new Date().getHours() + ":" + new Date().getMinutes();
if(user_name && password) { // If both the username and password were sent.
User.findOne({"field_data.user_name": user_name}).select('password
field_data').then( async (user) => {
if(!user) { // A record was not found.
console.log(currentTime + " - Failed Login: " + user_name);
var returnResult = {
error: true,
msg: "User Not Found."
};
res.json(returnResult);
} else { // A record was found.
console.log(currentTime + " - User Logged in: " +
user.field_data.first_name + " " + user.field_data.last_name);
let result = await user.CheckCredentials(password);
if(result) {
var returnResult = {
error: false,
msg: "Logged In: " + user.field_data.first_name + " " +
user.field_data.last_name,
data: {
first_name: user.field_data.first_name,
last_name: user.field_data.last_name,
user_roles: user.field_data.user_role,
id: user._id
}
};
// Set session data which creates record in session store and client
// cookie.
req.session.userId = user.id;
req.session.userRoles = user.field_data.user_role ;
req.session.userName = user.field_data.first_name + " " +
user.field_data.last_name;
req.session.save(); // This line makes no difference.
} else {
var returnResult = {
error: true,
msg: "Invalid Credentials!"
};
}
res.json(returnResult);
}
}).catch((e) => {
console.log(e)
});
} else {
res.json({error: true, msg: "Invalid username/password!"});
}
});
解决方案
我认为您的会话 maxAge 即将到期。我用过redis 你可以随意修改
var express = require("express");
var session = require('express-session');
var sessionConfig = {
secret: "your_secret",
store: // new redisStore({ client: redis.getClient() }),
resave: true,
rolling: true,
saveUninitialized: true,
cookie: { maxAge: 30 * 60000 }
}
var app = express();
app.use(session(sessionConfig));
app.post('/somepath', (req,res,next)=>{
// find your user or else
req.session.userData = {
id : user.id,
roles : user.field_data.user_role ,
name : user.field_data.first_name
}
});
推荐阅读
- apache-kafka - Kafka 到 BigQuery,消费消息的最佳方式
- reactjs - React 和 Redux dispatch 函数问题
- java - 两部分:交替读取数组和切换值,然后找到所需的最小切换数
- javascript - 在 2D forloop 内反转
- swiftui - SwiftUI Model 通过 ViewModel 编辑其他 ViewModel
- node.js - 使用 tsoa 定义具有多个端点的 Controller
- python - 如何修补方法以便第一次引发异常,但第二次调用底层方法
- sh - 如何在shell脚本中参数化变量值?
- powershell - 我可以传递一个函数并在 PSJobs 脚本块中调用它并接收返回值吗?
- flutter - 颤动如何检查字符串是否包含字符串列表中的至少一个字符串