我正在尝试使用由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
,也会失败。
答案 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();
在这种情况下导入的顺序很重要,因为您正在加载环境变量。