-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如果使用AsyncLocalStorage,如何能够在不被Egg管理的类中,也能正确地拿到上下文对象 #5271
Comments
https://github.com/search?q=org%3Aeggjs+AsyncLocalStorage&type=pullrequests Line 740 in ad6c06a
可以参考下 |
你好,这个方式应该也需要类继承对应的Application吧,如果是不继承呢,全局任意一个地方可以拿的 |
可以覆盖 koa 的 application 基类实现 https://github.com/eggjs/egg-core/blob/798d976017a510d155344b0a03d407ce615f20cf/lib/egg.js#L43 |
我也遇到一样的问题,希望ctxStorage能够在任意地方获取到,场景是一些sdk需要拿到当前的上下文ctx。 |
只要拿到 app 就能获取到 app.ctxStorage 了 |
搞一个 Symbol 然后挂到全局类似于 |
好像可以哦,就算多个 app 实例,共用一个 als 似乎也是可以正常工作的。 |
在 egg app 初始化之后,对 global 对象做赋值 https://github.com/koajs/koa/blob/v2.x/lib/application.js#L71 ,实现全局获取当前 als 能力。 |
closes eggjs/egg#5271 pick from #266
@ljj0915 使用 https://github.com/node-modules/gals 库可以获得,统一封装。 |
后来我自己使用AsyncLocalStorage,全局定义了一个,每次进来,在中间件里面,把next()包进去,后续任意一个地方都可以拿到了。差不多 |
egg >= 2.x 都支持从 gals 获取了。 |
优秀!可以愉快地进行异步上下文追踪了~ |
1.Egg里面,大部分的业务代码可能写在了Service、Controller层,这些可以通过继承Egg里面的对应类来完成被Egg管理。这样就能通过this.ctx拿到上下文对象。
2.问题是:如果有很多对象,都是通过new出来的话,就是无法直接从this.ctx拿到上下文。我想通过全局的对象拿到一个上下文。考虑到AsyncLocalStorage。
写法:
1.定义一个storage并暴露出去:
const { AsyncLocalStorage } = require('async_hooks');
const storage = new AsyncLocalStorage();
export default storage;
2.中间件里面(按顺序执行的第一个中间件)添加一个Context或者一个uuid也好:
import {storage} from './storage'
await storage.run(context, async () => await next());
3.在任意的地方,通过拿第一步的storage,再拿到storage存储的内容:
import {storage} from './storage'
console.log(storage.getStore())
上面的这个写法,对于本地开发下,单次http请求是没有任何问题的,但是我发现,在频率高的情况下,值就窜了,比如uuid。请问这样写是否有问题,以及有没有更好的解决方案或者思路。我在想为何会出现值窜的情况?
The text was updated successfully, but these errors were encountered: