为了账号安全,请及时绑定邮箱和手机立即绑定

NestJS - 如何在主应用程序模块文件中使用 .env 变量进行数据库连接

NestJS - 如何在主应用程序模块文件中使用 .env 变量进行数据库连接

青春有我 2022-12-22 15:25:23
我正在开发我的第一个 NestJS 应用程序,它在app.module.ts.但后来根据我们的要求,我不得不从环境文件中选择数据库配置值。为此,我遵循了 nestjs 文档网站上的配置文档 - https://docs.nestjs.com/techniques/configuration但问题是我需要在同一个文件中使用 .env 变量进行数据库连接,这是失败的。这是我工作正常的原始代码:@Module({  imports: [    MongooseModule.forRoot(`mongodb+srv://myusername:mypassword@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }),    ProductModule,    CategoryModule,  ],  controllers: [    AppController,    HealthCheckController,  ],  providers: [AppService, CustomLogger],})现在,我想根据环境从 .env 文件中选择那些数据库值,例如local.env等等。dev.env现在,我的这段代码不起作用:@Module({  imports: [    ConfigModule.forRoot({ envFilePath: `${process.env.NODE_ENV}.env` }),    MongooseModule.forRoot(`mongodb+srv://${ConfigModule.get('DB_USER')}:${ConfigModule.get('DB_PASS')}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' }),    ProductModule,    CategoryModule,  ],  controllers: [    AppController,    HealthCheckController,  ],  providers: [AppService, CustomLogger],})
查看完整描述

5 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

从这里的 Nestjs 文档 - https://docs.nestjs.com/techniques/configuration

这些步骤对我适用于 MySQL 和 TypeORM。

  1. 安装 Nestjs 配置模块 - npm i --save @nestjs/config. 它依赖于dotenv

  2. .env在您的根文件夹中创建一个文件并添加您的键/值对,例如DATABASE_USER=myusername

  3. 打开 app.module.ts 并导入配置模块

    import { ConfigModule } from '@nestjs/config';
  1. 将以下行添加到 的导入部分app.module.ts。我将它添加为第一次导入。它会自动加载 .env 文件的内容。

    ConfigModule.forRoot(),
  1. 然后,您可以按照数据库配置部分中的常规 process.env.<variable_name> 开始使用环境变量,例如

    process.env.DATABASE_USER

有关 ConfigModule 的更多配置,请参见上面的链接。您可以使用自定义文件/路径并将模块设置为全局可见。


查看完整回答
反对 回复 2022-12-22
?
浮云间

TA贡献1829条经验 获得超4个赞

1.继续使用ConfigModule


您需要NODE_ENV在 npm scripts 中设置,以便它可以用于根据 env 加载 env 文件。


"scripts": {

  "start:local": "NODE_ENV=local npm run start"

  "start:dev": "NODE_ENV=dev npm run start"

}

现在你可以使用ConfigModule:


@Module({

  imports: [

    ConfigModule.forRoot({ envFilePath: `${process.env.NODE_ENV}.env` }), 

MongooseModule.forRoot(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' })

    ...

})

2.使用dotenv


npm install dotenv

向您添加一些脚本以package.json设置您所在的环境。


"scripts": {

  ...

  "start:local": "NODE_ENV=local npm run start"

  "start:dev": "NODE_ENV=dev npm run start"

}

dotenv在main.ts文件中导入。确保在文件顶部执行此操作。


require('dotenv').config({ path: `../${process.env.NODE_ENV}.env` });

3.使用env-cmd


你可以使用env-cmdnpm 包。


npm install env-cmd

并在 中添加一些针对不同环境的命令package.json,例如:


"scripts": {

  ...

  "start:local": "env-cmd -f local.env npm run start"

  "start:dev": "env-cmd -f dev.env npm run start"

}

...

现在您可以使用环境变量,例如:


MongooseModule.forRoot(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@myhost.net?retryWrites=true&w=majority&db=dbname`, { useNewUrlParser: true, dbName: 'dbname' })

process.env.MONGO_CONNECTION_STRING


更新:


为了克服不同平台的 env set 命令问题,您可以安装cross-envpackage.


npm install -D cross-env

并更新脚本:


"scripts": {

  "start:local": "cross-env NODE_ENV=local npm run start"

  "start:dev": "cross-env NODE_ENV=dev npm run start"

}


查看完整回答
反对 回复 2022-12-22
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

MongooseModule.forRootAsync({

  imports: [ConfigModule],

  useFactory: async (configService: ConfigService) => ({

    uri: configService.get<string>('MONGODB_URI'),

  }),

  inject: [ConfigService],

});


查看完整回答
反对 回复 2022-12-22
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

通过使用 nestjs/config 包:


npm 安装@nestjs/config


安装包后,在 app 模块(app.module.ts 文件)中:


import { Module } from '@nestjs/common';

import { ConfigModule } from '@nestjs/config';


@Module({

  imports: [ConfigModule.forRoot()],

})


export class AppModule {}

之后,可以在整个应用程序中访问 .env 文件。假设您的 .env 文件如下所示。


DB_USER=mohit

访问 DB_USER 变量使用 process.env.DB_USER


查看完整回答
反对 回复 2022-12-22
?
波斯汪

TA贡献1811条经验 获得超4个赞

您需要使用MongooseModule.forRootAsync(() => {...})而不是MongooseModule.forRoot(...)

这使得 MongooseModule 等待其 IOC 依赖项。

请参阅:https ://docs.nestjs.com/techniques/mongodb#async-configuration


查看完整回答
反对 回复 2022-12-22
  • 5 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信