我想在NestJS的config中动态设置Websockets-gateway端口。下面是我的websockets-gateway代码。
import { WebSocketGateway } from '@nestjs/websockets';
const WS_PORT = parseInt(process.env.WS_PORT);
@WebSocketGateway(WS_PORT)
export class WsGateway {
constructor() {
console.log(WS_PORT);
}
}
但WS_PORT始终为NaN。
这是我的引导函数indie main.ts:
async function bootstrap() {
const app = await NestFactory.create(AppModule, { cors: false });
const configService = app.get(ConfigService);
initAdapters(app);
await app.listen(configService.get(HTTP_PORT), () => {
console.log('Listening on port ' + configService.get(HTTP_PORT));
});
}
下面是我的app.module.ts:
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: './src/config/dev.env',
isGlobal: true,
}),
RedisModule,
SocketStateModule,
RedisPropagatorModule,
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
secret: configService.get<string>(JWT_SECRET_KEY),
}),
inject: [ConfigService],
}),
],
controllers: [AppController],
providers: [WsGateway, AppService],
})
export class AppModule {}
我在网关构造函数中放置了一个控制台日志来打印'WS_PORT'的值,但它始终是NaN。
[Nest] 13252 - 10/04/2021, 5:05:34 PM LOG [NestFactory] Starting Nest application...
NaN
先谢谢你。
3条答案
按热度按时间wvt8vs2t1#
我找不到一种方法来添加动态数据到装饰器。所以为了能够动态地选择端口和其他配置,我必须:
SocketIoAdapter.ts
现在,您需要编辑
main.ts
以使用该适配器在本例中,我设置了端口和cors原点,这里是conf文件(使用.env)
env.local
的示例这里是指向配置服务的链接配置服务NestJs
qco9c6ql2#
如果在调用
app.init
之前对Gateway
进行修饰,则可以相对简单地完成此操作:1.导入
main.ts
中的类1.获取
ConfigurationService
的示例1.使用配置数据在类上手动调用装饰器
Gateway
的棘手之处在于,它与服务器一起启动,装饰器元数据需要比其他组件更早地应用到类中。您可以在app.init
之前在main.ts
中执行此操作。2skhul333#
在我的例子中,我找到了它的返回字符串(来自.env),port得到的是'string'而不是'number',
但如果输入
parseInt(this.configService.get<number>('SOCKETIO.SERVER.PORT'), 10);
,则可以请注意,服务器端和客户端的socket-io端口必须相同