事件顺序ExpressJS /节点

我试图使用事件来设置一个简单的ExpressJS Web服务器caching控制头。 代码看起来像这样:

app.get('*', function (req, res, next) { helper.setCacheHeader.call(res, SIX_MONTHS); // If something goes wrong (and we know about it) remove the cache value res.on('nocache', function () { helper.setCacheHeader.call(res, 0); }); next(); }); 

这是路由器的第一个路由,所以每个非静态文件都会经过这个路由。 我在代码中有一些地方可能会出错,我只是发送一个空的200,并在res上发出“nocache”事件。

 if (err) { res.emit('nocache'); return res.send(200, foo_bar) } 

似乎工作,当我触发一个错误事件,我的caching头被设置为0,如预期。 然而,我盯着它的时间越长,我就越不确定。

所有事件处理程序在响应结束( res.send之前是否已解决? 或者这是一个真正的竞争条件,我只是保持幸运,所以它看起来像在工作?

您的解决scheme将工作,因为事件是以同步方式发射和接收的。 通过使用res.emit('nocache')触发事件, res.emit('nocache') EventEmitter调用当前线程中的任何已注册侦听器(因为node.js是单线程的)。

EventEmitter不使用process.nextTick()来调用处理程序,所以为nocache事件注册的所有处理程序总是在res.send()之前被调用。 您可以在node.js源代码中检查EventEmitter的实现。