Dotenv没有正确加载

时间:2017-02-16 20:21:20

标签: javascript node.js environment-variables

我正在尝试使用由process.env加载的dotenv来访问某些环境变量。

我的文件夹结构:

.env
src
-- - server.js

我的server.js配置:

(...)
import auth from './middleware/auth'
import dotenv from 'dotenv'
dotenv.load({
    path: '../',
    silent: process.env.NODE_ENV === 'production'
})
auth()
// Instantiate app
const app = express();

我尝试访问process.env变量的文件:

(...)
module.exports = function() {
        console.log("env", process.env.MONGODB_URI)
        var options = {};
        options.jwtFromRequest = ExtractJwt.fromAuthHeader()
        options.secretOrKey = process.env.JWT_SECRET

记录env, undefined,然后与

崩溃

TypeError: JwtStrategy requires a secret or key

即使我将.env移至src(与服务器相同的目录)并移除path中的config,也会失败。

6 个答案:

答案 0 :(得分:5)

当您指定路径时,您需要将其填满:

require('dotenv').config({path: __dirname + '/../.env'});

.env是你的文件

答案 1 :(得分:2)

我在主nodejs .js条目文件中使用require('dotenv').config(),它运行正常。

来自docs

  

<强>路径

     

默认值:.env

     

如果您的文件包含环境,则可以指定自定义路径   变量的命名或位置不同。

     

require('dotenv').config({path: '/custom/path/to/your/env/vars'})

答案 2 :(得分:0)

使用可能会使用:

require('dotenv').config({ path: require('find-config')('.env') })

这将递归父目录,直到找到要使用的.env文件。

您也可以使用受上述一线启发而来的名为ckey的模块。

.env主目录中的文件。

# dotenv sample content
USER=sample@gmail.com
PASSWORD=iampassword123
API_KEY=1234567890

子目录中的一些js文件

const ck = require('ckey');

const userName = ck.USER;     // sample@gmail.com
const password = ck.PASSWORD; // iampassword123
const apiKey   = ck.API_KEY;  // 1234567890

答案 3 :(得分:0)

尝试一下;这应该工作。

import {} from 'dotenv/config'
import somethingElse from 'somethingElse'
...
[the rest of your code]

之所以有效,是因为ES6模块是如何导入模块的。

如果您想进一步研究。 请参考这个。 https://hacks.mozilla.org/2015/08/es6-in-depth-modules/

  

摘要:

     

运行包含导入声明的模块时,该模块会   首先加载导入文件,然后在一个模块中执行每个模块主体   依赖图的深度优先遍历,避免循环   跳过已经执行的任何内容。

希望这会对某人有所帮助。

答案 4 :(得分:0)

如果您正在使用在多个软件包/工作空间中使用单个.env文件的mono-repo,则可以使用以下内容查找根.env文件。

从npm安装查找程序包:https://www.npmjs.com/package/find-up

import find from 'find-up';

export const findEnv = () => find.sync(process.env.ENV_FILE || '.env');

答案 5 :(得分:0)

您必须在应用的最顶层设置 dotenv 配置:

import dotenv from 'dotenv'
dotenv.load({
    path: '../',
    silent: process.env.NODE_ENV === 'production'
})
(...)
import auth from './middleware/auth'

auth()
// Instantiate app
const app = express();

在这种情况下导入的顺序很重要,因为您正在加载环境变量。