事件订购ExpressJS / Node

时间:2014-01-19 14:17:46

标签: javascript node.js express

我正在尝试使用事件在简单的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)?或者这真的是一种竞争条件而且我一直很幸运,所以看起来它正在发挥作用?

1 个答案:

答案 0 :(得分:0)

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

EventEmitter不使用process.nextTick()来调用处理程序,因此所有为nocache事件注册的处理程序始终在res.send()之前调用。您可以在node.js source中查看EventEmitter的实施情况。