事件顺序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
的实现。