我正在尝试使用事件在简单的ExpressJS Web服务器中设置缓存控制头。代码看起来像这样:
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)
}
当我触发错误事件时,此出现,我的缓存标头按预期设置为0。但是,我盯着它的时间越长,我就越不确定。
所有事件处理程序是否在之前解析然后在响应结束时解析(res.send
)?或者这真的是一种竞争条件而且我一直很幸运,所以看起来它正在发挥作用?
答案 0 :(得分:0)
您的解决方案将起作用,因为事件以同步方式发出和接收。通过使用res.emit('nocache')
触发事件,EventEmitter
调用当前线程中的任何已注册侦听器(因为node.js是单线程的)。
EventEmitter
不使用process.nextTick()
来调用处理程序,因此所有为nocache事件注册的处理程序始终在res.send()
之前调用。您可以在node.js source中查看EventEmitter
的实施情况。