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 = {};
这个解释足以理解域的用法。
问题
-
对多个请求使用域是否安全?
-
如何确保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。