Skip to content

如果使用AsyncLocalStorage,如何能够在不被Egg管理的类中,也能正确地拿到上下文对象 #5271

@ljj0915

Description

@ljj0915

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。请问这样写是否有问题,以及有没有更好的解决方案或者思路。我在想为何会出现值窜的情况?

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions