我在NestJs项目的根目录下有一个.env
文件,其中包含一些env变量。
奇怪的是,我能够读取服务文件中的变量,但不能读取模块文件中的变量。
因此,在users.service.ts
这样的服务文件中,可以这样工作:
saveAvatar() {
const path = process.env.AVATAR_PATH // returns value from .env
}
但是,当访问模块文件(如auth.module.ts
)中的路径时,这将返回空值:
@Module({
imports: [
JwtModule.register({
secretOrPrivateKey: process.env.SECRET // process.env.SECRET returns an empty string
})
]
})
为什么会这样呢?我怎样才能可靠地访问NestJs中.env
文件中的环境变量呢?
7条答案
按热度按时间rbl8hiat1#
当您的
JwtModule
示例化时,您的.env
文件尚未读入。因此,请在创建nest应用之前提前读入它,例如在您的main.ts
中读入,或者更好:创建一个ConfigService
,并明确依赖于您的配置:关于如何创建
ConfigService
,请参见this answer。xqkwcwgp2#
声明顺序在您的用例中很重要。
这是可行的:
当这一切
这是因为ConfigModule在TypeOrmModule之前或之后加载。
lbsnaicq3#
您可以将其用作全局变量,以便从其他模块进行访问。
当你想在其他模块中使用ConfigModule时,你需要导入它(这是任何Nest模块的标准)。或者,通过设置选项对象的isGlobal属性为true来声明它为全局模块,如下所示。在这种情况下,一旦ConfigModule被加载到根模块中(例如AppModule),你就不需要在其他模块中导入它。
https://docs.nestjs.com/techniques/configuration#use-module-globally
你也可以在这里找到如何使用配置服务:https://docs.nestjs.com/techniques/configuration#using-the-configservice
wn9m85ua4#
正如@KimKen所说,问题在于,当JwtModule示例化时,环境变量仍然没有加载。然而,我对@KimKen的回答有一个不同的方法,您可能也会感兴趣。
首先,NestJS提供了一个加载环境变量的ConfigModule,所以你不需要创建一个,除非你想处理它不同于通常.(https://docs.nestjs.com/techniques/configuration)
现在,为了解决这个问题,我把这个模块(auth.module.ts)动态化了。简而言之,动态模块是接收参数的模块,它依赖于输入参数来进行正确的示例化。(https://docs.nestjs.com/fundamentals/dynamic-modules)
这里的真实的情况是,JwtModule也是一个动态模块,因为它依赖于一个变量来进行正确的示例化。因此,这也导致了您的模块依赖于参数来进行正确的示例化,因此使其动态化!:)。
那么您的auth.模块将类似于:
然后,它将是一样容易,因为在您的应用程序。模块或任何地方,你加载的auth。模块导入它通过forRoot静态方法。
注意:我建议在app.module.ts中导入一次ConfigModule
PD:您可以让动态auth.模块接收forRoot方法中的参数,并在app.模块中传递环境变量
process.env.SECRET
但似乎动态模块是最后加载的,因此不需要这样做。
r6vfmomb5#
我刚刚意识到我也解决了我的问题,只是导入dotenv并在我的模块(auth.module.ts)的开头调用方法config。
如果在项目根目录下使用默认的.env文件,则无需指定路径。
6rqinv9w6#
这对我很有效
解决方案是使用
trim()
函数,因为在Windows中,空格会添加到环境变量值的末尾wlwcrazw7#
我也遇到过类似的问题。我在另一台机器上编写代码,运行良好。将repo克隆到另一台机器上,尝试运行,但遇到了env变量问题,因为我没有.env文件。复制了它,但仍然收到错误消息。删除node_modules并安装,然后nom run build为我解决了这个问题