#node.js #next.js #express-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 });
});
}
myMiddleware.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 // ???
},
});
};
Thanks for any help!