如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件

Posted

技术标签:

【中文标题】如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件【英文标题】:How to Pass data from express middleware directly back to client JWT and Express middleware 【发布时间】:2021-09-06 12:37:03 【问题描述】:

我目前被困在尝试使用 express 中间件、react 和 JWT 实现刷新令牌。我遇到的问题是我需要将刷新的令牌从中间件函数传递回客户端。我尝试使用 res.locals.variableName 和 res.set,但是一旦中间件函数完成并调用 next(),我会在我的路由中使用 res.json 进行响应,我认为这会覆盖我在来自中间件的响应。如何在仍然能够调用 next() 的同时将此刷新令牌返回到客户端?

app.all('*',  function (req, res, next) 

  const headerToken = req.headers.token;
  const refreshToken = req.headers.refreshtoken;
  const isVerifiedPath = verifyPaths(unauthorizedPaths, currentPath);


  if (isVerifiedPath) 
    next()
  
  else 
    jwt.verify(headerToken, process.env.KEY, async (err, data) => 
      if (err) 
        if (err.expiredAt)  // expired web token
          jwt.verify(refreshToken, process.env.KEY, async (err, data) => 
            if (data) 
              const User = require('./models/User');
              const user = await User.query().findById(data.user.id);
              const token = jwt.sign( user , process.env.KEY,  expiresIn: 5 );
              req.user = user;
              res.locals.varName = token; // I would like this to be accessible from the response my api returns
              next();
            
          )
        
        else 
          return res.status(401).json( err: 401 );
        
      
      else 
        req.user = data.user;
        next();
      
    );
  
);

【问题讨论】:

您希望如何访问res.locals.varName?您的路线如何使用res.locals,那里会覆盖什么? 在 res.set 或 res.locals.varName 设置之后,如果我 console.log(res) 它就在那里。在 next() 之后调用的路由中也是如此。但是,在 next() 之后调用的路由中,我返回 res.json(random stuff) 并且我希望响应包含 refreshToken 并且可以从客户端访问。问题是它一旦返回客户端就不存在了。我假设它被 res.json() 覆盖,会是这样吗? @Bergi 您希望它如何发送给客户?作为头条?作为身体的一部分? res.locals 通常与视图引擎一起使用,而不是原始 json 响应。 啊,我不知道。但是是的,我想成为正文或标题的一部分,而不是将其包含在 next() 之后调用的路由中。我有很多路由,所以理想情况下,如果可能的话,我希望它从中间件函数附加到响应对象。 @Bergi 如果你想作为header发送,只需从中间件发送header即可。要将其作为正文的一部分发送,路由需要合作。 【参考方案1】:

我的问题的解决方案是通过这样的标头传递令牌。我无法查看令牌客户端,因为我没有公开标头(第 2 行)。

res.set('x-token', token);
res.set('Access-Control-Expose-Headers', 'x-token');

【讨论】:

以上是关于如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件的主要内容,如果未能解决你的问题,请参考以下文章

jwt on node - 客户端如何将令牌传递回服务器

express 中间件

将数据从 Node.js 发送回客户端

如何使用express [重复]在nodejs中将对象从服务器端传递到客户端

如何通过使用 node.js 和 express 的 onclick 将数据从一个页面传递到另一个页面?

如何使用 express 中间件处理所有路由?