【问题标题】:Cant access variables from .env file in node.js application无法从 node.js 应用程序中的 .env 文件访问变量
【发布时间】:2021-09-08 14:40:01
【问题描述】:

我正在尝试使用 mongodb atlas 数据库对一个 Strapi 应用程序进行 dockerize。我面临的问题是 /config 中的数据库文件没有从 .env 文件中读取变量。

.env 文件

HOST=0.0.0.0
PORT=1337
DATABASE_HOST=xyz.mongodb.net
DATABASE_USERNAME=abc-admin
DATABASE_PASSWORD=12345xyz
ADMIN_JWT_SECRET=abcd1234

数据库连接代码

const {
  DATABASE_HOST,
  DATABASE_USERNAME,
  DATABASE_PASSWORD
} = process.env;

module.exports = ({ env }) =>
  ({
    defaultConnection: 'default',
    connections: {
      default: {
        connector: 'mongoose',
        settings: {
          host: env('DATABASE_HOST', process.env.DATABASE_HOST),
          srv: env.bool('DATABASE_SRV', true),
          port: env.int('DATABASE_PORT', 27017),
          database: env('DATABASE_NAME', 'xyz-dev'),
          username: env('DATABASE_USERNAME', process.env.DATABASE_USERNAME),
          password: env('DATABASE_PASSWORD', process.env.DATABASE_PASSWORD)
        },
        options: {
          authenticationDatabase: env('AUTHENTICATION_DATABASE', null),
          ssl: env.bool('DATABASE_SSL', true),
        },
      },
    },
  });

我已经尝试过使用 process.env 并且在上面的文件中没有它。但是当我在构建后运行图像时,它显示以下错误

error 连接到 Mongo 数据库时出错。 URI没有 主机名、域名和 tld

知道我在这里做错了什么吗?谢谢

【问题讨论】:

  • .env 文件不会自动加载。您需要使用一些包才能将它们传递给节点。
  • 好的,谢谢。我应该在哪里添加该代码?在我的数据库文件中?

标签: node.js mongodb docker strapi mongodb-atlas


【解决方案1】:

一种选择是使用dotenv,您需要导入dotenv 并运行dotenv.config(),然后才能开始使用环境变量

所以换成

import dotenv from "dotenv";
dotenv.config()
// your code which user process.env

其他选项是在您的操作系统级别定义所有这些环境变量。在 unix 上,您可以添加到 ~/.bashrc 文件

【讨论】:

  • 阿米特你能详细说明一下吗?由于我从客户端获得了此代码,因此我不允许更改代码。我们可以在不导入 dotenv 的情况下访问它吗?或者如果不可能,我应该在哪里导入 dotenv 并编写 dotenv.config()
  • 您必须将其导入此文件或在此之前执行的任何文件中。如果您不想更改代码,则可以在操作系统中定义环境变量
  • 。我试图在数据库文件中导入 env 包,现在它显示以下错误 #8 1.410 Error while running command build: Could not load js config file /config/database.js: Cannot use import statement outside a module
  • 也许您正在使用旧节点更改从“dotenv”导入 dotenv; dotenv.config()
  • 我已经尝试了有关 dotenv 及其 process.env 语法的所有内容,它显示错误连接到 Mongo 数据库时出错。 URI 没有主机名、域名和 tld 错误。不知道为什么:/
【解决方案2】:

这是对您的问题的更详细的答案(在阅读您的 cmets 之后)。创建.env 文件意味着您刚刚创建了它。它不会自动加载。这是在 unix 机器上使用的典型方式,但与 Node 无关。

您需要做的是以某种方式解析该文件的内容(纯文本),将其转换为键值对并将其传递给 node.有很多包,Amit 展示的一个是dotenv。它为您完成所有工作,最后,您将变量注入到 process.env 中。

最简单的方法是安装这个包(来自 npm)并按照描述使用它。但是如果你不能以任何方式修改代码,那么你可以简单地用脚本解析文件的内容,然后启动节点服务器。这是一个例子(取自npm scripts: read .env file):

"scripts": {
  "example": "some-lib --argument --domain $(grep DOMAIN .env | cut -d '=' -f2)"
}

这里的缺点是它不能在各种操作系统上运行,并且使用特定的库比手动脚本测试要多得多。

【讨论】:

  • 感谢您的详细回答。我尝试在数据库文件中导入 env 包,现在它显示以下错误 #8 1.410 Error while running command build: Could not load js config file /config/database.js: Cannot use import statement outside a module
  • 这就是你如何使用 JS 的全部 - 大多数情况下 node 与 CommonJS 一起工作(const hi = require("hi")。导入语句是 ES6 模块,这两个很难在一起:) 如果你遵循 Amit 的代码,那么你应该使用const dotenv = require("dotenv")
  • 我已经尝试了上面的代码并在我的 docker 文件中添加了 npm install dotenv,但它仍然显示“连接到 Mongo 数据库时出错。URI 没有主机名、域名和 tld”错误。 ://
猜你喜欢
  • 2020-07-04
  • 2019-11-03
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2016-09-22
  • 2022-06-15
  • 2017-07-26
  • 2017-03-21
相关资源
最近更新 更多