如何在NestJS中将命令行传入的Token传递给AppService?
将命令行Token传递给AppService的几种方法
方法一:使用自定义注入令牌(依赖注入规范方式)
步骤1:定义注入令牌
在项目中创建一个常量文件(比如constants.ts),或者直接在模块文件中定义:
export const TOKEN_KEY = Symbol('COMMAND_LINE_TOKEN');
步骤2:动态注册令牌提供者
修改bootstrap函数,在创建应用后动态注册令牌对应的提供者:
async function bootstrap() { const token = process.argv[2]; // 修正原代码多余的右括号 const app = await NestFactory.create(AppModule, { logger: ['debug', 'verbose'] }); // 为AppModule注册令牌提供者 app.select(AppModule).provide(TOKEN_KEY, { useValue: token }); app.useGlobalGuards(new AuthGuard()); // 修正原代码缺少的构造函数括号 await app.listen(3000); } bootstrap();
步骤3:在AppService中注入令牌
修改AppService,通过@Inject()装饰器注入令牌对应的值:
import { Injectable, Inject } from '@nestjs/common'; import { TOKEN_KEY } from './constants'; // 引入定义的令牌 @Injectable() export class AppService { constructor( @Inject(TOKEN_KEY) private readonly token: string ) {} getValue(): string { return this.token; } }
方法二:直接获取实例赋值(快速实现方式)
如果不需要严格遵循依赖注入规范,可以直接在bootstrap中获取AppService实例,手动设置token属性:
修改bootstrap函数
async function bootstrap() { const token = process.argv[2]; // 修正原代码多余的右括号 const app = await NestFactory.create(AppModule, { logger: ['debug', 'verbose'] }); // 获取AppService实例并赋值token const appService = app.get(AppService); appService.token = token; app.useGlobalGuards(new AuthGuard()); // 修正原代码缺少的构造函数括号 await app.listen(3000); } bootstrap();
修改AppService
@Injectable() export class AppService { token: string; // 声明token属性 getValue(): string { return this.token; } }
注意事项
- 原代码中
process.argv[2]);多了一个右括号,new AuthGuard少了构造函数括号,以上示例已修正。 - 如果你的
AuthGuard也需要使用这个token,可以用同样的注入方式传递。
内容的提问来源于stack exchange,提问作者enigmatic
相关产品推荐
相关产品推荐

