当前位置: 首页 > 知识库问答 >
问题:

无法从节点中的.env文件访问变量。js应用程序

游乐池
2023-03-14

我正在尝试用mongodb atlas数据库对一个trapi应用程序进行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),
        },
      },
    },
  });

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

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

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

共有2个答案

朱浩大
2023-03-14

对于你的问题,这里有一个更详细的回答(看了你的评论)。正在创建<代码>。env文件意味着您刚刚创建了它。它不会自动加载。这是在unix机器上使用的典型方式,但是与节点没有任何关系。

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

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

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

这里的缺点是它不适用于各种操作系统,并且为此使用特定的库比您的手动脚本经过更多的测试。

满玉泽
2023-03-14

一种选择是使用dotenv,您需要导入dotenv并运行 ,然后才能开始使用env变量

所以改为

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

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

 类似资料:
  • 使用最新版本的6.2,对JBPM来说是相当新的。我正在尝试建立一个进程,通过该进程,我可以在打开某些(自定义)任务类型时调用遗留平台的REST API,并在它们完成时再次通过异步进程在未来的某个时间点。 在较高级别上,该过程应类似于: 旧版应用程序- 旧版应用程序- 我已经创建并注册了一个ProcessEventListener,并在AfterNode触发事件中创建了一个钩子来调用特定类型的节点。

  • 我在从 docker-compose.yml 文件(版本 -3.7)读取 .env 变量时遇到问题,这里首先我解释我的文件夹和示例代码结构 我的文件夹结构 my_app > src config.py app.py requirements.txt 其他文件 Dockerfile docker-compose.yml .包封/包围(动词envelop的简写) .env文件 这是我的示例 .env

  • 问题内容: 我正在使用Jenkins Build Flow插件来实现并行化。Groovy DSL执行某些文件操作。即使该选项设置为在特定从属服务器上运行作业,但DSL仍在主服务器上运行。这不是故意的。 有人可以告诉我如何限制DSL在指定的从站上运行吗?即使有一种方法可以通过DSL访问从文件系统,也应该可以。 通常,我们如何使用Groovy从Jenkins主节点访问节点从节点上的文件? 工作空间位于

  • 我正在编写一个程序,在这个程序中,我必须使用Ubuntu中的IDE IntelliJ思想获得一些env变量,如JAVA_HOME。 我已经在/etc/profile和~/.bashrc中设置了所有的env变量,但是对于这样的代码,我不能访问我设置的env,因为代码只能访问/etc/environment中设置的变量。 等-配置文件

  • 我正试图从我的Node js应用程序中的@microsoft/mgt库导入,遇到了一些问题-有人能帮我吗。我已经在使用Babel来使用ES6模块。 我错过了什么-我是新的节点:( 导出*from@microsoft/mgt-元素'; ^^^^^^ 语法错误:意外令牌导出在wrapSafe(内部/模块/cjs/loader.js:1053: 16)在模块。_compile(内部/模块/cjs/loa

  • 问题内容: 我正在尝试在cgo中访问ac struct,但是要这样做 无法确定C.utmpx的名称种类 utmpx是结构 这是执行代码: 在utmpx.h文件中,有 我可以使用_PATH_UTMPX,但在使用UTMPX_FILE时也会收到相同的警告,为什么? 看来我无法访问在.h文件中声明的这些变量,该怎么办? 平台:macOS sirria,go 1.8 问题答案: 我必须定义_GNU_SOUR