
[英]Scoped service in controller is different from the service called in the middleware
[英]REQUEST first used in a middleware but cannot be retrieved from a controller
REQUEST scope 表示为每个请求创建一个新实例,根据 Nest JS 的请求生命周期是:中间件、管道、守卫和拦截器。 我正在一个中间件中创建一个带有 scope REQUEST 的服务,该中间件初始化服务实例的 id,并将这个中间件连接到每个端点,期望在 controller 和以下服务中获取完全相同的服务实例。
但是发现服务实例id是未定义的。 如果我首先在 controller 中使用该服务,那很好:可以从以下服务中获取相同的实例。
这是因为请求生命周期的上下文吗?
服务:
@Injectable({scope: Scope.REQUEST})
export class IdService {
private _id: string
get id(): string {
return this._id;
}
set id(value: string) {
this._id = value;
}
}
中间件
import {v4 as uuidv4} from 'uuid';
@Injectable()
export class AddIdMiddleware implements NestMiddleware {
constructor(private idService: IdService) {}
use(req: any, res: any, next: () => void): any {
const pid = uuidv4()
this.idService.id = pid
console.log(`generated tranceId in idService is: ${this.idService.idd}`)
next();
}
}
controller
export class XXXController {
constructor( private idService: IdService) {}
@Get("/test")
public async getId() {
console.log(`the id generated in the PER-REQUEST scope is ${this.idService.id} !!!!!!!!`)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.