1

ExpressJS 的新手问题:

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

我对么?NodeJS 域 API:http ://nodejs.org/api/domain.html#domain_class_domain

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

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

Node.js - 每个 Express 请求的域,在另一个域内

4

3 回答 3

3

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

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

结合forky,事情会变得更好。

于 2014-01-14T16:10:00.460 回答
3

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

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

  • 在重新启动服务器之前,给其他请求一些时间以成功完成。这就是node.js 文档中这个示例的重点。

但是,您需要小心,因为调用像 node-mysql 这样的 3rd-party 模块可能会让您在不知不觉中切换到不同的域。

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

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

  return function () {
    var args = arguments;

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

我就这个问题发表了演讲。如果您有兴趣,请查看幻灯片。

于 2014-01-14T16:44:10.760 回答
1

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

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

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

于 2016-11-26T10:21:00.557 回答