如何在ClientsModule中使用环境变量?
How to use environment variables in ClientsModule?
我正在尝试在 ClientsModule 中使用环境变量:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.register([
{
name: 'PROCESS_SERVICE',
transport: Transport.RMQ,
options: {
queue: process.env.RMQ_PRODUCER_QUEUE_NAME,
urls: [process.env.RMQ_PRODUCER_URL],
queueOptions: { durable: true },
},
},
]),
我也试过这个:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { ConfigService } from '@nestjs/config';
const configService = new ConfigService();
const rmqProcessUrl = configService.get<string>('RMQ_PRODUCER_URL');
const rmqProcessQueue = configService.get<string>('RMQ_PRODUCER_QUEUE');
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.register([
{
name: 'PROCESSES_SERVICE',
transport: Transport.RMQ,
options: {
queue: rmqProcessQueue,
urls: [rmqProcessUrl],
queueOptions: { durable: true },
},
},
]),
但两次都出现以下错误:
TypeError: metatype is not a constructor
当我直接使用这些值时,它按预期工作。我也尝试过导入和使用
export const rmqServiceName = process.env.RMQ_PRODUCER_QUEUE_NAME
和
export const rmqServiceName = process.env.RMQ_PRODUCER_URL
但这也会导致同样的错误。
那么我怎样才能访问 @ClientsModule
中的 .env
变量呢?
是否有我缺少的解决方法?
我发现了问题所在,以防有人遇到和我一样的问题。
应该做的是在app.module.ts
中导入nestjs/config
和ConfigModule
,并使用ClientsModule.register
的async
方法。
在app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
在我正在处理的模块中:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.registerAsync([
{
name: 'PROCESSES_SERVICE',
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
transport: Transport.RMQ,
options: {
queue: configService.get<string>('RMQ_PRODUCER_QUEUE'),
urls: [configService.get<string>('RMQ_PRODUCER_URL')],
queueOptions: { durable: configService.get<boolean>('RMQ_PRODUCER_QUEUE_DURABLE') },
},
}),
inject: [ConfigService],
},
]),
我正在尝试在 ClientsModule 中使用环境变量:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.register([
{
name: 'PROCESS_SERVICE',
transport: Transport.RMQ,
options: {
queue: process.env.RMQ_PRODUCER_QUEUE_NAME,
urls: [process.env.RMQ_PRODUCER_URL],
queueOptions: { durable: true },
},
},
]),
我也试过这个:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { ConfigService } from '@nestjs/config';
const configService = new ConfigService();
const rmqProcessUrl = configService.get<string>('RMQ_PRODUCER_URL');
const rmqProcessQueue = configService.get<string>('RMQ_PRODUCER_QUEUE');
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.register([
{
name: 'PROCESSES_SERVICE',
transport: Transport.RMQ,
options: {
queue: rmqProcessQueue,
urls: [rmqProcessUrl],
queueOptions: { durable: true },
},
},
]),
但两次都出现以下错误:
TypeError: metatype is not a constructor
当我直接使用这些值时,它按预期工作。我也尝试过导入和使用
export const rmqServiceName = process.env.RMQ_PRODUCER_QUEUE_NAME
和
export const rmqServiceName = process.env.RMQ_PRODUCER_URL
但这也会导致同样的错误。
那么我怎样才能访问 @ClientsModule
中的 .env
变量呢?
是否有我缺少的解决方法?
我发现了问题所在,以防有人遇到和我一样的问题。
应该做的是在app.module.ts
中导入nestjs/config
和ConfigModule
,并使用ClientsModule.register
的async
方法。
在app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
在我正在处理的模块中:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
TypeOrmModule.forFeature([Process]),
ClientsModule.registerAsync([
{
name: 'PROCESSES_SERVICE',
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
transport: Transport.RMQ,
options: {
queue: configService.get<string>('RMQ_PRODUCER_QUEUE'),
urls: [configService.get<string>('RMQ_PRODUCER_URL')],
queueOptions: { durable: configService.get<boolean>('RMQ_PRODUCER_QUEUE_DURABLE') },
},
}),
inject: [ConfigService],
},
]),