我有一个看似常见的问题,却没有一个通用的解决方案。导入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,您的问题可能是由useFactory
是async
引起的。
如果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
。