【发布时间】:2022-01-25 07:14:39
【问题描述】:
我有一个看似常见的问题,却没有一个共同的解决方案。我试图在导入 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 变量,因此我将使用自定义配置文件..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
..........
【问题讨论】:
-
感谢您提供配置文件,但更多关于
/configuration.ts的内容可能会有所帮助。例如,这里的导出函数是什么,一个空的 lambda,你是否将结果包装在另一个对象中?为什么你只是返回完全相同的东西。您还可以尝试更清楚地了解您的HOST变量,以及您想要设置它的位置和时间。我觉得它可能会在您的 configuration.ts 文件中使用 async-await 来解决,但在阅读您的编辑/评论后,我现在有点模糊。 -
同时检查这是否适用于您的问题:nestjs ConfigModule.forRoot() asynchronuous
-
@YılmazDurmaz 也许我不清楚......让我再试一次。 Nestjs 使用 dotenv 从 .env 中收集值。我们也知道 Nestjs 然后通过 configuration.ts 文件和 ConfigService 使这些可用。这些似乎工作正常......这里没问题。当 app.module 尝试从 process.env 或 ConfigService 收集 .env 值时,就会出现问题。这是在 Neo4jModule.forRootAsync{.....useFactory: async(.....)} 中完成的。其中应返回五个值(SCHEME、HOST、USERNAME、PASSWORD 和 PORT)。除了 HOST,所有都可以使用 process.env 或 ConfigService 传递。
-
好的,现在它变得更奇怪了。我以为你是从其他适合异步/等待的地方获取主机。现在你说一切都在同一个地方,只有 HOST 似乎不起作用。您是否检查了日志以了解有关格式问题的任何错误消息?