首页 > 解决方案 > 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 // ???
    },
   });
 };

谢谢你的帮助!

标签: node.jsnext.jsexpress-session

解决方案


推荐阅读