我正在尝试编写一个在 NextJS 处理程序之前运行的中间件,并检查接收到的会话cookie是否有效/不受干扰。这是我将其连接到server.js
文件中的方式:
server.use('*', preLoadMiddleware);
server.get('*', (req, res) => handle(req, res));
中间件本身尝试设置一个标记身份验证状态的局部变量:
import getSessIDFromCookies from '../utils/get-sessid-from-cookies';
import redis from 'redis';
import dotenv from 'dotenv';
dotenv.config();
const preLoadMiddleware = (req, res, next) => {
const client = redis.createClient(
process.env.REDIS_PORT,
process.env.REDIS_HOST,
);
const cookieKeys = Object.keys(req.cookies);
const sessCookie = getSessIDFromCookies(req);
client.get(`sess:${sessCookie}`, (err, reply) => {
if(reply) {
console.log('SESSION VALID', reply);
res.locals.authenticated = true;
}
else {
console.log('SESSION NOT VALID');
res.locals.authenticated = false;
}
});
next();
};
module.exports = preLoadMiddleware;
然后在_app.js
中,我尝试读取此变量以进行进一步的决策:
if (ctx.isServer) {
if(ctx.res) {
if(ctx.res.locals) {
console.log('AUTHENTICATED', ctx.res.locals.authenticated);
}
}
}
我的问题是,ctx.res.locals.authenticated
总是在undefined
中返回_app.js
!发生了什么事?
我考虑了另一种方法,在中间件中设置cookie:
res.cookie('AUTHENTICATED', 'false')
但是随后抛出错误:
发送后无法设置标题
请帮助!我应该如何让_app.js
知道我的中间件在会话cookie中的发现?
答案 0 :(得分:1)
next()在中间件中立即被调用。您可能想在回调中调用它。 (client.get第二个arg)。当前,它不等待回调完成。