【问题标题】:Http request from inside express route来自快速路由内部的 Http 请求
【发布时间】:2017-03-10 23:48:09
【问题描述】:

当用户访问路线时,我想在使用jade/pug 渲染页面之前获取一些数据,并传递该数据。

router.get('/', function(req, res, next) {
  asyncHttp()
    .then(data => {
      res.render('routeToRender', {
        title: 'routeToRender', data: data
      })
    })
    .catch(err=>{log(err})
})

我收到“错误:发送后无法设置标头。”可能是因为我的 asyncHttp 设置了一些标头。如何将该请求与路由隔离?

【问题讨论】:

  • asyncHttp 是做什么的?确保它无权访问 res,因此无法设置标题。
  • 那是因为您在响应周期结束后调用渲染。这是一个异步调用,因为它返回一个承诺。查看生成器或异步/等待。
  • @natnai 在 Express 路由处理程序中进行异步调用非常好。
  • @natnai true,但如果 asyncHttp() 被称为 syncHttp()(并且是同步的),并且它会返回响应,则会抛出相同的错误。问题不在于正在调用异步函数,而在于正在对响应对象执行不应该对其执行的操作:)
  • @robertklep 同意。我认为这个 TS 没有显示完整的路由处理程序。链中在此之前或之后发生了一些事情。如果他真的没有在这个函数中调用 next() ,那么很可能更远的东西已经发送了响应。这就是路由中的异步调用很难的原因。没有更多上下文很难调试。

标签: javascript node.js http express


【解决方案1】:

只要不更改 res 对象,路由中的异步 http 请求就可以了。

错误是在 res.redirect() 到路由的上游,缺少返回语句。

我无法得出结论,为什么 asyncHttp() 将其暴露出来并且没有它就不会出现错误。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2020-03-27
    • 1970-01-01
    • 2016-09-03
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多