Express 无法将数据从自定义预处理程序中间件传递到_app.js
我正在尝试编写一个在NextJS处理程序之前运行的中间件,并检查接收到的会话cookie是否有效/未被阻止。这就是我在Express 无法将数据从自定义预处理程序中间件传递到_app.js,express,cookies,next.js,Express,Cookies,Next.js,我正在尝试编写一个在NextJS处理程序之前运行的中间件,并检查接收到的会话cookie是否有效/未被阻止。这就是我在server.js文件中连接它的方式: server.use('*', preLoadMiddleware); server.get('*', (req, res) => handle(req, res)); 中间件本身尝试设置本地变量标记身份验证状态: import getSessIDFromCookies from '../utils/get-sessid-from-
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;
然后在\u app.js
中,我尝试读取此变量,以便进一步决策:
if (ctx.isServer) {
if(ctx.res) {
if(ctx.res.locals) {
console.log('AUTHENTICATED', ctx.res.locals.authenticated);
}
}
}
我的问题是,ctx.res.locals.authenticated
总是在\u app.js
中返回未定义的!发生什么事了
我考虑了另一种选择,在中间件中设置cookie:
res.cookie('AUTHENTICATED', 'false')
但是它抛出了一个错误,说:
发送邮件后无法设置邮件头
请帮忙!我应该如何让\u app.js
知道我的中间件在会话cookie上的发现?立即在中间件中调用next()。您可能希望在回调中调用它。(client.get第二个参数)。当前它没有等待回调完成。已经尝试过了,但问题仍然存在。I设置req.isauth=1当我尝试console.log('ISAUTH',ctx.req.ISAUTH')时,它显示为ISAUTH undefined
代码>在\u app.jsx
中。哦!刚刚注意到您正在中间件中立即调用next()。您可能希望在回调中调用它。(client.get第二个参数)。目前它没有等待回调完成,所以这就是问题所在。我在回调函数外部调用next()
,该函数在设置变量之前触发。我把它移到回调中,现在它可以正常工作了。但是,我仍然使用res.locals
而不是req
让它工作。如果你能用你关于next()
的评论更新你的答案,我可以接受并结束。