kes*_*hav 6 javascript node.js thread-local-storage express node.js-domains
我的用例要求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);
});
Run Code Online (Sandbox Code Playgroud)
Nodejs域显式绑定的更多解释
在controller/service中 - process.domain将为您提供上面创建的域并且您可以轻松地将值绑定到此域.例如:
process.domain.obj = {};
Run Code Online (Sandbox Code Playgroud)
这种解释足以理解域的用法.
问题
将域用于多个请求是否安全?
如何确保process.domain对于不同的请求是不同的而不是相同的?
我还想知道在继续本地存储中如何处理这些问题
首先 - 域已弃用,并将在即将发布的 NodeJS 版本中删除。我不会使用它们编写新代码。
其次 - 理解域不是魔法很重要。它们真的是一个简单的概念。基本上,他们:
这是实现域的方法,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!
};
Run Code Online (Sandbox Code Playgroud)
喜欢的东西express可以做domain = new RequestContext在开始时,然后请求中调用的所有方法都可以工作,因为它们都像上面的例子一样被包装(再次,它被烘焙到节点本身)。
它们被移除是因为它们增加了实现的复杂性,而且它们存在泄漏和错误恢复的事实,在边缘情况下它不起作用。
您有其他选择,例如 bluebird promises .bind带来了承诺链上下文,这是一种不太泄漏的方法。
也就是说,我会完全避免隐含的全局上下文。它使重构变得困难,它使依赖项变得隐含并且使代码更难以推理。我只是在创建对象时将相关上下文传递给对象(简而言之,依赖注入)而不是设置全局变量。
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |