【发布时间】:2019-06-27 20:33:07
【问题描述】:
continuation-local-storage 似乎被使用,也在 express 的上下文中。
但是非常基本的用法对我不起作用,因为上下文完全丢失了!
var createNamespace = require('continuation-local-storage').createNamespace;
var session = createNamespace('my session');
async function doAsync() {
console.log('Before getting into the promise: ' + session.get('test'));
await Promise.resolve();
console.log('*in* the promise: ' + session.get('test'));
}
session.run(() => {
session.set('test', 'peekaboo');
doAsync();
});
结果:
$ node server_test.js
Before getting into the promise: peekaboo
*in* the promise: undefined
是我做错了什么还是 CLS 完全坏了? 还是图书馆坏了? 如果它不适合使用 Promise,是否还有其他概念可以作为 threadLocal 存储以适当的方式实现多租户?
【问题讨论】:
-
为什么不
doAsync("peakaboo")?是的,图书馆似乎没有提到承诺。 -
@JonasWilms 这只是一个简约的例子。该库用于多租户环境,在我的实际用例中,它从 mongo db 获取文档,但我认为这个示例更适合理解问题。
-
JavaScript 本身提供了一种机制来访问不同作业内部的共享状态,闭包。每个试图模仿这种行为的库都会付出巨大的代价,因为它必须与每一项工作挂钩。这就是为什么 NodeJS 不推荐使用它的原生 hooks 库,因为它遇到了同样的问题。这些库没有得到维护表明它们也远非完美。
-
@JonasWilms 你可以扩展闭包如何用于这种情况吗?节点现在做什么?如何从任何地方访问与请求相关的值?
标签: javascript node.js promise continuation-local-storage