NodeJS域和expressjs

新手到ExpressJS问题:

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

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

(很明显,我问的原因是,在项目结束后,域function很难实现)。

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

Node.js – 每个快速请求的域,在另一个域内

使用这个模块可以让域名工作更less: https : //github.com/brianc/node-domain-middleware 。

除此之外,虽然确实只有单个请求可能会失败,但是这些错误有时会使服务器处于不良状态(泄漏的资源就是一个例子),在此时重新启动服务器被认为是很好的forms。 如果Express的内置error handling程序负责处理,则不能自行closures服务器。 因此,拥有这个域名的原因之一就是为了让你可以在代码中获得一个好的点来捕获这个域名。 上面的中间件做了很多工作,将error handling代码从主stream中抽出,并保持干净。

结合福克斯 ,事情会变得更好。

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

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

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

但是 ,您需要小心,因为调用像node-mysql这样的第三方模块可以让您在不知道的情况下切换到不同的域。

在调用一个asynchronous模块之前,我总是使用它:

exports.preserveDomain = function (fun) { var d = process.domain; return function () { var args = arguments; d.run(function () { fun.apply(null, args); }); }; }; 

我谈了这个问题。 如果您有兴趣,请查看幻灯片 。

不幸的是,节点域现在被弃用,所以你可能不应该使用它们(你也不应该使用这个中间件):(

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

为了克服这个缺点,我创build了基于协议的库来编写asynchronous代码: https : //github.com/vacuumlabs/yacol 。 如果你在你的项目中使用它,你可以拥有所有的领域善良与周围相当体面的语义。