node dotenv无效

use*_*998 40 environment-variables node.js

我正在尝试使用节点dotenv模块,它不适合我.我在config/config.js上有一个文件,其中包含以下内容:

'use strict';

var dotenv = require('dotenv');
dotenv.load();
console.log('config');
Run Code Online (Sandbox Code Playgroud)

我的app文件夹的根目录下也有一个名为.env的文件.我也有像TWILIO_ACCOUNT_SID这样的环境变量.这是我尝试在某个函数中使用环境变量时经历的过程:

$ node
> require('./config/config.js');
config
{}
> process.env.TWILIO_ACCOUNT_SID
undefined
Run Code Online (Sandbox Code Playgroud)

我在.env文件中定义了TWILIO_ACCOUNT_SID,但是当我尝试在控制台上输出值时,我得到的错误是未定义的.如果您对如何解决此问题有任何建议,我将非常感激.

Bas*_*ANI 67

在我的情况下,每次我尝试使用密钥表单.env文件时.env,它返回process.env.MY_KEY

因为我将文件命名undefined为不被认为是keys.env文件,我在这个问题上遭受了两个小时的困扰

所以这是 .env

  1. 确保文件名是".env"(我认为".env.test"是可以接受的)

  2. .env使用此声明确保您在申请中要求它.env.test

  3. 确保require('dotenv').config();文件是.env.

  4. 确保你遵循DB_HOST=localhost这样的.env,因为不需要用双引号或单引号将它们包起来

另请查看npm网站上的软件包文档https://www.npmjs.com/package/dotenv

希望这能节省您的时间

  • 将.env文件移至它工作的项目的根目录。 (4认同)
  • 好,非常感谢您的投入!这是我的问题。可能只是为我和其他人节省了两个多小时。 (2认同)
  • 我将我的命名为“twitter.env”,而不仅仅是“.env”。*叹* (2认同)

tel*_*liz 36

我解决了使用

require('dotenv').config({path: __dirname + '/.env'})
Run Code Online (Sandbox Code Playgroud)

或使用绝对路径:

C:\\asd\\auhsd\\.env
Run Code Online (Sandbox Code Playgroud)

如果他没有找到.env文件,他会离开undefined


use*_*381 22

为您节省一些故障排除时间并记录您的需求呼叫,例如:

console.log(require('dotenv').config())
Run Code Online (Sandbox Code Playgroud)

您应该看到一个错误,其中包含有关该问题的更多详细信息。

  • 您可以更进一步,并在选项中添加 {debug: true}。console.log(require('dotenv').config({debug: true})); (10认同)

小智 11

最近有同样的问题.请检查.env文件并执行以下操作:

key=value
Run Code Online (Sandbox Code Playgroud)

代替

key:value
Run Code Online (Sandbox Code Playgroud)


nds*_*svw 8

我遇到了同样的问题,我尝试了 4 个小时来查找故障。就我而言,这很奇怪。

当我尝试“node app.js”时,它起作用了。当我想要一个守护进程启动它时,它不起作用。

我是如何解决我的问题的?我替换了:

var dotenv = require('dotenv');
dotenv.load();
Run Code Online (Sandbox Code Playgroud)

和:

var dotenv = require('dotenv').config({path: path.join(__dirname, '.env')})
Run Code Online (Sandbox Code Playgroud)

  • 而不是使用 `__dirname` 只需使用 `process.env.PWD` (3认同)

and*_*und 8

我也遇到了 .env 变量没有加载和被undefined.

我试过的:

索引.js:

import dotenv from 'dotenv';
dotenv.config();
import models from './models';
Run Code Online (Sandbox Code Playgroud)

模型.js

import Sequelize from 'sequelize';
const sequelize = new Sequelize(
    process.env.DATABASE,
    process.env.DATABASE_USER,
    process.env.DATABASE_PASSWORD,
    {
        dialect: 'postgres',
    }
);
Run Code Online (Sandbox Code Playgroud)

显然,由于在 nodejs 中加载导入的工作方式,模型的导入index.js导致 models.js 在dotenv.config(). 因此我从 process.env 得到了未定义的值。

当我更改 models.js 以执行 dotenv 配置时,例如:

import Sequelize from 'sequelize';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
    process.env.DATABASE,
    process.env.DATABASE_USER,
    process.env.DATABASE_PASSWORD,
    {
        dialect: 'postgres',
    }
);
Run Code Online (Sandbox Code Playgroud)

它开始工作了!


use*_*998 7

我没有像在dotenv模块文档中那样将我的环境变量放在正确的格式中,例如我正在导出TWILIO_CALLER_ID ="+ wwehehe",因此dotenv模块没有正确解析我的文件.当我注意到我从声明中删除了export关键字,一切正常.


Ant*_*aud 7

我有同样的问题。我意识到我的文件是以某种方式编码的UCS-2 BE BOM。将我的.env文件转换为UTF-8固定的文件(例如,您可以使用Notepad ++轻松地完成该操作)。

  • 你救了我的一天!我在powershell脚本中使用echo命令通过TFS生成.env文件,但该文件已保存为UCS-2编码。所以现在我确定powershell将其保存为utf-8,并且一切正常! (3认同)

Kno*_*dge 6

注意您还从ROOT文件夹执行 Node 脚本。

例如,我在名为./bin/test.js. 称之为:node ./bin/test.js工作得很好。从子文件夹调用它,如:

$ pwd
./bin
$ node ./test.js
Run Code Online (Sandbox Code Playgroud)

导致dotenv找不到我的./.env文件。


Ahm*_*aib 5

确保将 pm2 配置中的 cwd 设置为对 dotenv.config() 的任何调用的正确目录。

示例:您的 index.js 文件在 /app/src 中,您的 .env 文件在 /app 中。你的 index.js 文件有这个

dotenv.config({path: "../.env"});

你的 pm2 json 配置应该是这样的: "cwd": "/app/src", "script": "index.js"

你也可以使用 dotenv.config({path: path.join(__dirname, "../.env")}); 以避免CWD问题。如果将 .env 或 index.js 文件相互移动,您仍然会遇到问题。


Kor*_*rte 5

确保尚未设置变量。Dotenv不会覆盖它们。

如果设置了变量,则必须将其删除。在powershell中,您可以使用以下命令- 如此处所述

Remove-Item Env:\MyTestVariable
Run Code Online (Sandbox Code Playgroud)


Ras*_*bal 5

我在 Windows 10 上使用 NodeJS。我使用process.env.var-name来访问变量但失败了,因为它为我提供了 Windows 路径变量作为 JSON 对象,所以我安装了 dotenv ( npm install dotenv )。dotenv项目的 .evn 文件中获取进程环境变量

  1. npm install dotenv 或 yarn add dotenv

在此处输入图片说明

  1. const dotenv = require('dotenv'); dotenv.config();

在此处输入图片说明

  1. process.env.variable_name

在此处输入图片说明 在此处输入图片说明

  1. 输出

在此处输入图片说明


Wal*_*d93 5

工作解决方案:

如果您正在使用 webpack(您绝对应该这样做),请使用一个非常方便的插件dotenv-webpack.env它解决了从文件读取环境变量的问题

确保.env位于项目的根目录中。

安装插件步骤:

  1. npm i -D dotenv-webpack
  2. webpack.config文件中:
     const Dotenv = require('dotenv-webpack');
     module.exports = {
          ...
          plugins: [
                new Dotenv(),
                ...
          ],
          ...
     };
Run Code Online (Sandbox Code Playgroud)

现在您可以在任何文件中.env使用调用文件中定义的任何环境变量process.envjs


小智 5

我使用的代码结构如下所示

-.env
-app.js
-build
-src
   |-modules
        |-users
            |-controller
                  |-userController.js
Run Code Online (Sandbox Code Playgroud)

我的 app.js 顶部需要 .env

require('dotenv').config();
import express = require('express');
import bodyParser from 'body-parser';
import mongoose = require('mongoose');
Run Code Online (Sandbox Code Playgroud)

process.env.PORT 在我的 app.listen 函数中工作。但是,在我的 userController 文件上,不确定这是如何发生的,但我的问题是,当我使用 console.log() 检查时,我得到了 SecretKey 值并输入为字符串,但在 jwt.sign() 上尝试时得到了未定义,例如

console.log('Type: '+ process.env.ACCESS_TOKEN_SECRET)
console.log(process.env.ACCESS_TOKEN_SECRET)
Run Code Online (Sandbox Code Playgroud)

结果:

string
secret
Run Code Online (Sandbox Code Playgroud)

jwt.sign 给出错误

let accessToken = jwt.sign(userObj, process.env.ACCESS_TOKEN_SECRET); //not working 
Run Code Online (Sandbox Code Playgroud)

错误是

    Argument of type 'string | undefined' is not assignable to parameter of type 'Secret'.
  Type 'undefined' is not assignable to type 'Secret'.
Run Code Online (Sandbox Code Playgroud)

我的解决方案:阅读文档后。我在我的文件中再次需要 env(我可能应该首先拥有它)并将其保存到变量“环境”中

let environment = require('dotenv').config();
Run Code Online (Sandbox Code Playgroud)

控制台日志记录环境给出:

{
parsed: {
    DB_HOST: 'localhost',
    DB_USER: 'root',
    DB_PASS: 'pass',
    PORT: '3000',
    ACCESS_TOKEN_SECRET: 'secretKey',
  }
}
Run Code Online (Sandbox Code Playgroud)

在 jwt.sign 上使用它不起作用

let accessToken = jwt.sign(userObj, environment.parsed.ACCESS_TOKEN_SECRET);
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助,我已经坚持了几个小时了。请随意在我的答案中添加任何可能有助于解释更多内容的内容。