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



我有一个看似常见的问题,却没有一个通用的解决方案。导入Neo4jModule时,我正试图从Nestjs app.module访问.env数据。如果我使用硬编码的值,一切都很好,但process.env或configService似乎都没有得到这些值。关于这个问题,我似乎举了很多例子,但显然答案很难找到。我试过以下几种不同的答案,但都不管用。我确实知道我们在初始化过程中有点早,但我不知道如何将请求延迟到初始化完成。

---->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来分配env变量,因此我将使用自定义配置文件。。我在ConfigModule.forRoot中加载的configuration.ts。如有任何帮助,将不胜感激。

我需要为@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
..........

检查nestjs-neo4j-realworld-example,您的问题可能是由useFactoryasync引起的。

如果Neo4jModule激发了useFactory方法,但没有为返回调用await,那么您仍然会在控制台中看到日志,但在此之前将使用空配置调用Neo4j。

试试这个改变

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

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


编辑:感谢您添加配置内容。我将它们与我的配置进行了比较。如果你复制/粘贴你的材料,你的材料只是打字错误。您在HOST的行末尾有一个忘记的尾随逗号。

除了类型之外,.env文件基本上按照写入的方式解析为=前后两部分的数组。由于它们最初是作为字符串读取的,因此不需要引号。此外,一些图书馆可能会从引文中略读第二部分,但大多数图书馆不会,在我看来,省略它们更安全。

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

PS:从你的评论回复中,我推断出一切都在同一个地方,除了HOST之外,所有的东西都起作用,所以这次编辑应该会有所帮助。如果不会,请编辑您的帖子,在评论中反映我们的讨论,以便下一个人可以比我更清楚地看到问题并提供帮助。

如果我正确理解了您的问题,那么您正在尝试访问.env文件中包含的环境变量。这可以通过在src/main.ts:中使用dotenv来实现

import dotenv from 'dotenv'
dotenv.config()

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

最新更新