Express 无法将数据从自定义预处理程序中间件传递到_app.js

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-

我正在尝试编写一个在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;
然后在
\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=1console.log('ISAUTH',ctx.req.ISAUTH')时,它显示为
ISAUTH undefined
\u app.jsx
中。哦!刚刚注意到您正在中间件中立即调用next()。您可能希望在回调中调用它。(client.get第二个参数)。目前它没有等待回调完成,所以这就是问题所在。我在回调函数外部调用
next()
,该函数在设置变量之前触发。我把它移到回调中,现在它可以正常工作了。但是,我仍然使用
res.locals
而不是
req
让它工作。如果你能用你关于
next()
的评论更新你的答案,我可以接受并结束。