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
确保文件名是".env"(我认为".env.test"是可以接受的)
.env使用此声明确保您在申请中要求它.env.test
确保require('dotenv').config();文件是.env.
DB_HOST=localhost这样的.env,因为不需要用双引号或单引号将它们包起来另请查看npm网站上的软件包文档https://www.npmjs.com/package/dotenv
希望这能节省您的时间
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)
您应该看到一个错误,其中包含有关该问题的更多详细信息。
小智 11
最近有同样的问题.请检查.env文件并执行以下操作:
key=value
Run Code Online (Sandbox Code Playgroud)
代替
key:value
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,我尝试了 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)
我也遇到了 .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)
它开始工作了!
我没有像在dotenv模块文档中那样将我的环境变量放在正确的格式中,例如我正在导出TWILIO_CALLER_ID ="+ wwehehe",因此dotenv模块没有正确解析我的文件.当我注意到我从声明中删除了export关键字,一切正常.
我有同样的问题。我意识到我的文件是以某种方式编码的UCS-2 BE BOM。将我的.env文件转换为UTF-8固定的文件(例如,您可以使用Notepad ++轻松地完成该操作)。
注意您还从ROOT文件夹执行 Node 脚本。
例如,我在名为./bin/test.js. 称之为:node ./bin/test.js工作得很好。从子文件夹调用它,如:
$ pwd
./bin
$ node ./test.js
Run Code Online (Sandbox Code Playgroud)
导致dotenv找不到我的./.env文件。
确保将 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 文件相互移动,您仍然会遇到问题。
确保尚未设置变量。Dotenv不会覆盖它们。
如果设置了变量,则必须将其删除。在powershell中,您可以使用以下命令- 如此处所述:
Remove-Item Env:\MyTestVariable
Run Code Online (Sandbox Code Playgroud)
我在 Windows 10 上使用 NodeJS。我使用process.env.var-name来访问变量但失败了,因为它为我提供了 Windows 路径变量作为 JSON 对象,所以我安装了 dotenv ( npm install dotenv )。dotenv 从项目的 .evn 文件中获取进程环境变量
工作解决方案:
如果您正在使用 webpack(您绝对应该这样做),请使用一个非常方便的插件dotenv-webpack.env它解决了从文件读取环境变量的问题
确保
.env位于项目的根目录中。
安装插件步骤:
npm i -D dotenv-webpack 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)
希望这会有所帮助,我已经坚持了几个小时了。请随意在我的答案中添加任何可能有助于解释更多内容的内容。
| 归档时间: |
|
| 查看次数: |
54176 次 |
| 最近记录: |