node.js - nodejs和nextjs版本更新后的session问题
问题描述
不完全清楚为什么在更新 nodejs(10.19.0 > 12.14.0) 和 nextjs(8 > 10.2.3) 的版本后,会话开始出现问题。
我在会话中保存了经过身份验证的用户的某个对象,并对其进行了各种操作。
发生了什么:来自客户端的多个 API 调用,服务器上正确的 req.session.identity 接收到“最后一个请求”(下面是伪代码):
public static async getInitialProps(ctx: INextContext) {
await ctx.store.execSagaTasks(ctx, (dispatch: Dispatch) => {
dispatch(Users.actions.getUsers()); // => router.put('/users', (req: Request, res: Response) => { console.log(req.session.identity) => undefined });
dispatch(Comments.actions.getComments()); // => router.put('/comments', (req: Request, res: Response) => { console.log(req.session.identity) => identity });
});
}
我的中间件.ts /
export default (req: Request, res: Response, next: Function) => {
passport.authenticate('jwt', async(err, identity) => {
const isLogged = identity.current.role !== 'guest';
if (!isLogged) {
console.log('identity => ', identity);
// When the page is requested, it makes several calls: on the first call,
// it returns the correct object from the session, on the second, it returns undefined
console.log('session: ', req.session.identity);
}
});
});
服务器.ts /
app.prepare()
.then(() => {
const server = express();
server.use(compression());
server.use(cookieParser());
server.use(bodyParser.json({limit: '10mb'}));
server.use(bodyParser.urlencoded({ extended: true }));
server.use(cookieSession({
name: 'session',
keys: [ config.jwtSecret ],
maxAge: 31 * 24 * 60 * 60 * 1000,
// secure: false // ???
}));
server.use(passport.initialize());
server.use(locale(config.locale.supported, config.locale.default));
server.use(myMiddleware);
server.use(cacheRoute(app));
...
// routes
...
server.get('*', (req, res) => {
const handle = routes.getRequestHandler(app);
handle(req, res, req.url);
});
})
.catch((ex) => {
process.exit(1);
});
会话.ts /
import config from '../config';
import session from 'express-session';
const MongoStore = require('connect-mongo')(session);
export default (connection) => {
let store = null;
store = new MongoStore({
mongooseConnection: connection,
autoRemove: 'interval',
autoRemoveInterval: 60, // Remove after one hour
});
return session({
secret: config.jwtSecret,
saveUninitialized: true,
resave: false,
rolling: true,
store,
cookie: {
maxAge: 31 * 24 * 60 * 60 * 1000, // 31 days
secure: false // ???
},
});
};
谢谢你的帮助!
解决方案
推荐阅读
- java - 如何使用 JDA(Java discord API)获取用户的最后在线状态
- spring-boot - Spring Boot 2.3.0.RELEASE 和日志路径
- python - 理解 Numpy 的 `multivariate_normal` 方法
- angular - 错误:此构造函数与 Angular 依赖注入不兼容
- python - 如何在异步任务完成之前做一些工作?
- python - TypedDict 无法声明名为“not”的属性
- pytorch - 使用 LSTM 有状态来传递上下文 b/w 批次;可能是上下文传递中的一些错误,没有得到好的结果?
- ruby - 测试套件不会加载到 VSCode Ruby 测试资源管理器中
- java - 有没有办法在本地局域网内保存时使用 NetBeans 的部署(JAVA Servlet)
- python - 让 C 扩展类继承自 Python 类