如何在 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,您的问题可能是由于 useFactory
为 async
。
如果 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 以在评论中反映我们的讨论,以便下一个人可以比我更清楚地看到问题并提供帮助。
我有一个看起来很常见的问题,但没有通用的解决方案。我正在尝试在导入 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
:
import dotenv from 'dotenv'
dotenv.config()
添加这些行后,您可以访问环境变量,就像您在问题中所说的那样:process.env.SOME_VARIABLE
.
正在检查 nestjs-neo4j-realworld-example,您的问题可能是由于 useFactory
为 async
。
如果 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 以在评论中反映我们的讨论,以便下一个人可以比我更清楚地看到问题并提供帮助。