【发布时间】: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