如何在 Nestjs v8 中访问 Neo4j 的 .env 变量 app.module

how to access .env variables for Neo4j in Nestjs v8 app.module

我有一个看起来很常见的问题,但没有通用的解决方案。我正在尝试在导入 Neo4jModule 时从我的 Nestjs app.module 访问我的 .env 数据。如果我使用硬编码值,一切正常,但 process.env 或 configService 似乎都无法获取值。我似乎有很多这个问题的例子,但显然答案是难以捉摸的。我尝试了以下不同的答案,但 none 有效。我知道我们在初始化过程中有点早,但我不知道如何将请求延迟到初始化完成。

---->app.module
........
 import configuration from './config/configuration';
 import { Neo4jConfig, Neo4jModule } from 'nest-neo4j'
 import { ConfigModule, ConfigService } from '@nestjs/config';


 @Module({
     imports: [DbServerModule,
               ConfigModule.forRoot({
                 load: [configuration],
                 isGlobal: true
               }),
               Neo4jModule.forRootAsync({
                 imports: [ConfigModule],
                 useFactory: async (configService: ConfigService) => ({
                   scheme: 'bolt',                                    
                   host: configService.get('NEO4J_HOST'),            
                   port: configService.get('NEO4J_PORT'),               
                   username: configService.get('NEO4J_USERNAME'),    
                   password: configService.get('NEO4J_PASSWORD'),               
              }),
    
             inject: [ConfigService],
           }),
          ],
     ........

OR
@Module({
  imports: [DbServerModule,
            ConfigModule.forRoot({
              load: [configuration],
              isGlobal: true
            }),
            Neo4jModule.forRoot({
                scheme: 'bolt',                                   // 
                process.env.NEO4J_SCHEME, 
                host: process.env.NEO4J_HOST, 
                port: process.env.NEO4J_PORT,  
                username: process.env.NEO4J_USERNAME, 
                password: process.env.NEO4J_PASSWORD            
              }),

          ],

编辑...... 下面的代码显示我们可以访问 useFactory {} 块中的 .env 变量...console.log 记录正确的 .env 值,但由于属性,Neo4j 连接仍然失败:

Neo4jModule.forRootAsync({
     inject: [ConfigService],
     useFactory: async (configService: ConfigService) => {         
     console.log(`USERNAME...
                .${configService.get('NEO4J_USERNAME')}`);
     return ({
              scheme: 'bolt',                                    
              host: configService.get('NEO4J_HOST'),            
              port: configService.get('NEO4J_PORT'),               
              username: configService.get('NEO4J_USERNAME'),    
              password: configService.get('NEO4J_PASSWORD'),               
            });
          },

我的生产部署将使用 Rancher 分配环境变量,因此我将使用自定义配置文件.. configuration.ts 我将其加载到 ConfigModule.forRoot。如有任何帮助,我们将不胜感激。

我要感谢@adamCowley 在 nest-neo4j 包装器上的工作。它消除了将 Nestjs 与 Neo4j 集成的许多复杂性...谢谢

编辑:根据请求: -config/configuration.ts

  .....
  NEO4J_SCHEME: process.env.NEO4J_SCHEME,       
    NEO4J_HOST: process.env.NEO4J_HOST,         
    NEO4J_USERNAME: process.env.NEO4J_USERNAME, 
    NEO4J_PASSWORD: process.env.NEO4J_PASSWORD, 
    NEO4J_PORT: process.env.NEO4J_PORT,
   ......

.env

........
NEO4J_SCHEME='bolt'
NEO4J_HOST='127.0.0.1',       
NEO4J_USERNAME='username'
NEO4J_PASSWORD='password'
NEO4J_PORT=7687
..........

  

如果我没有正确理解你的问题,那么你正在尝试访问 .env 文件中包含的环境变量。这可以通过在 src/main.ts:

中使用 dotenv 来实现
import dotenv from 'dotenv'
dotenv.config()

添加这些行后,您可以访问环境变量,就像您在问题中所说的那样:process.env.SOME_VARIABLE.

正在检查 nestjs-neo4j-realworld-example,您的问题可能是由于 useFactoryasync

如果 Neo4jModule 触发 useFactory 方法但没有 await return,那么您仍会在控制台中看到日志,但 Neo4j 将之前用空配置调用。

试试这个改变

from:
useFactory: async (configService: ConfigService){}
----
to:
useFactory: (configService: ConfigService): Neo4jConfig{}

如果这不能解决您的问题,那么编辑您 post 并为这 4 个变量提供 ./config/configuration 文件的精简版本以及您的配置文件。


编辑: 感谢您添加配置内容。我将它们与我的配置进行了比较。如果您 copy/paste 写了 material,那么您的只是一个拼写错误。您在 HOST 行末尾忘记了一个逗号。

除了类型,.env文件基本上完全按照写的方式解析成=前后两部分的数组。因为它们首先被读取为字符串,所以不需要引号。还有一些图书馆可能会从引号中略过第二部分,但大多数不会,所以在我看来,省略它们更安全。

NEO4J_SCHEME=bolt
NEO4J_HOST=127.0.0.1
NEO4J_USERNAME=username
NEO4J_PASSWORD=password
NEO4J_PORT=7687

PS:根据您的评论回复,我推断所有内容都在同一个地方,并且除了 HOST 之外的所有内容都有效,因此此编辑应该有所帮助。如果不行,请编辑您的 post 以在评论中反映我们的讨论,以便下一个人可以比我更清楚地看到问题并提供帮助。