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

时间:2019-09-03 08:51:32

标签: 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-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中的发现?

1 个答案:

答案 0 :(得分:1)

next()在中间件中立即被调用。您可能想在回调中调用它。 (client.get第二个arg)。当前,它不等待回调完成。