NodeJS域名和表达

时间:2014-01-14 15:28:05

标签: node.js express node.js-domains

对ExpressJS问题的新手:

我打算创建一个相当简单(但很大)的ExpressJS项目,该项目响应REST请求并执行只读数据库响应。我已经阅读了有关捕获错误的NodeJS域名,但我不清楚我是否需​​要这个项目。我的测试似乎表明即使在最糟糕的未捕获的抛出和崩溃中,只有单个REST请求失败,而不是整个服务器。

我说错了吗? NodeJS域API:http://nodejs.org/api/domain.html#domain_class_domain

(显然我问的原因是在项目结束后事后很难实现域功能。)

如果不需要,这篇文章让我对NODEJS for Express的想法感到冷淡:(如果不需要,我不会使我的代码复杂化。)

Node.js - Domain per Express request, inside another domain

3 个答案:

答案 0 :(得分:3)

使用此模块使域工作更少:https://github.com/brianc/node-domain-middleware

除此之外,虽然只有单个请求可能会失败,但错误有时会使您的服务器处于错误状态(泄漏的资源就是一个例子),并且在此时重新启动服务器被视为良好的形式。如果Express的内置错误处理程序负责这一点,您将无法自行关闭服务器。因此,拥有域名很好的一个原因是,您可以在代码中找到一个很好的点来捕获它。上面的中间件在将错误处理代码从主流中拉出并保持清洁方面做了很多工作。

结合forky,事情变得更好。

答案 1 :(得分:2)

通过将每个Express请求分配到单独的域,您可以:

  • 获取有关错误的有意义的信息:触发它的查询,请求的用户等等。

  • 在重新启动服务器之前,请给其他请求一些时间才能成功完成。这是node.js文档中this example的重点。

然而,你需要小心,因为调用像node-mysql这样的第三方模块可以让你切换到另一个域而不会意识到它。

我总是在调用异步模块之前使用它:

exports.preserveDomain = function (fun) {
  var d = process.domain;

  return function () {
    var args = arguments;

    d.run(function () {
      fun.apply(null, args);
    });
  };
};

我谈了这个问题。如果您有兴趣,请查看the slides

答案 2 :(得分:0)

可悲的是,节点域现已弃用,因此您可能不应该使用它们(也不应该使用此中间件):(

https://nodejs.org/api/domain.html

为了克服这个缺点,我创建了基于协程的库来编写异步代码:https://github.com/vacuumlabs/yacol。如果你在你的项目中使用它,你可以拥有所有领域的优点,周围有相当不错的语义。