【问题标题】:Nodejs Express send res.render and res.json simultaneouslyNodejs Express 同时发送 res.render 和 res.json
【发布时间】:2019-07-02 10:29:41
【问题描述】:

如何使用 Express 在 NodeJS 中同时发送 res.render 和 res.json。我想要类似的东西:

app.get(basePath, function (req, res, next) {
    //More stuff
    res.json({token: token});
    res.render(path.join(publicPath, '/main'), 
        {mv: mv});
});

但它只给了我令牌而不呈现页面。使用这种方法:

app.get(basePath, function (req, res, next) {
    //More stuff
    res.render(path.join(publicPath, '/main'), 
    {mv: mv, token: token});
});

我无权访问令牌参数(我必须将其存储在客户端中)

这个想法是避免使用 2 个请求(一个用于页面测试令牌,一个用于生成新令牌以重新测试旧令牌)。并避免在每个视图中都有一个隐藏的令牌跨度。

【问题讨论】:

  • 您试图实现的目标是不安全的。如果用户已连接,则应考虑使用 cookie 或会话(如果要发送的令牌)。此外,只需使用中间件来重新生成令牌。伊齐奥。
  • 但我读到 cookie 比 tokenn 更不安全,因为任何人都可以窃取它。我只有 15 分钟的代币。我不知道究竟什么效果更好。

标签: node.js express


【解决方案1】:

HTTP 使用一个循环,每个请求需要一个响应。当客户端发送请求时,服务器应该只向客户端发送一个响应。这样您只需向客户端发送一个响应res.render()res.json()

如果您想设置一些数据,例如身份验证令牌,您可以使用res.set()res.header() 在您的标头上设置。 documentation

app.get(basePath, function (req, res, next) {

    //More Stuff ...

    res.header('token', JSON.stringify({ token: 'token' })); //use encrypted token
    res.render(path.join(publicPath, '/main'), { mv: mv });
});

要为所有路由器或特定路由器集设置标头,您可以使用middleware

【讨论】:

  • 太棒了!这对这种情况非常有用。非常感谢
【解决方案2】:

1) 使用中间件生成令牌 2) 快速提示,{token:token}{token} 相同

【讨论】:

  • 感谢您的提示(我不太了解 sintax)关于中间件,我有私有和公共页面,所以使用中间件我也会为公共页面生成令牌(我不知道如果这是一个好习惯)。并且仍然存在如何将两者都发送到视图的问题(使用中间件生成的令牌和页面的渲染)。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2014-09-23
  • 2017-10-18
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多