nodejs域名如何在多个请求的幕后实际工作?

我的用例需要node.js域在请求级别跨服务器文件共享信息。

在express.js中的样例实现

domain = require('domain'); app.use(function(req, res, next) { var reqDomain = domain.create(); reqDomain.add(req); reqDomain.add(res); reqDomain.run(next); }); 

Nodejs域的更多解释显式绑定

控制器/服务 – process.domain将为您提供以上创build的域,您可以轻松地绑定到这个域的值。 例如:

 process.domain.obj = {}; 

这个解释足以理解域的用法。

问题

  1. 对多个请求使用域是否安全?

  2. 如何确保process.domain对于不同的请求有不同的不同?

我也想知道如何在持续的本地存储中处理这些问题

一个警告

首先 – 域被弃用,并将在即将发布的NodeJS版本中被删除。 我不会使用它们来编写新的代码。

域如何工作?

其次,了解领域并不是魔术很重要。 他们真的是一个简单的概念。 基本上他们:

  • 在平台中包装每个asynchronous调用(整个NodeJS API)。
  • 在通话期间设置一个“全局”variables。
  • 如果在该调用期间正在进行另一个asynchronous调用,请在input时注意将全局variables设置为相同的值。
  • 而已。

下面是如何实现域,让我们只为了简单实现setTimeout

 const oldTimeout = setTimeout; setTimeout = function(fn, ms) { // also ...args, but let's ignore that var trackedDomain = domain; oldTimeout(function() { var oldDomain = domain; // preserve old context domain = trackedDomain; // restore context to "global" variable fn(); // call the function itself domain = oldDomain; // restore old context }, ms); // that's it! }; 

express这样的东西可以在开始时执行domain = new RequestContext ,然后在请求中调用的所有方法都可以工作,因为它们都像上面的示例一样包装(因为它再次被烘焙到节点本身中)。

这听起来不错,为什么要删除它们?

他们被删除,因为他们添加的实现复杂性,事实上他们是泄漏和错误恢复有边缘情况下,它不工作。

那我该怎么办?

你有其他的select,例如蓝鸟承诺有带来承诺链上下文这是一个less漏的方式来做到这一点。

这就是说,我只是完全避免隐含的全球背景。 它使得重构变得困难,隐含的依赖关系使得代码难以推理。 我只是将相关的上下文传递给对象,当我创build它们(dependency injection,简而言之),而不是设置一个全局variables。

Interesting Posts