ChatGPT解决这个技术问题 Extra ChatGPT

为节点设置环境变量以检索

我正在尝试遵循教程,它说:

有几种方法可以加载凭据。从环境变量加载,从磁盘上的 JSON 文件加载,密钥需要如下:USER_ID,USER_KEY ...这意味着如果您正确设置了环境变量,则根本不需要在应用程序中管理凭据.

根据一些谷歌搜索,看来我需要在 process.env 中设置变量?如何以及在哪里设置这些凭据?请举例。

请链接教程。

S
SamT

环境变量(在这种情况下)用于将凭据传递给您的应用程序。 USER_IDUSER_KEY 都可以分别从 process.env.USER_IDprocess.env.USER_KEY 访问。您无需编辑它们,只需访问它们的内容。

看起来他们只是让您选择从 process.env 或磁盘上的某个特定文件加载 USER_IDUSER_KEY

现在,当您运行应用程序时,奇迹发生了。

USER_ID=239482 USER_KEY=foobar node app.js

这会将用户 ID 239482 和用户密钥作为 foobar 传递。这适用于测试,但是对于生产,您可能需要配置一些 bash 脚本来导出变量。


如果您使用 fish 而不是 bash,则需要使用:env USER_ID=239482 my_command。例如,为 node.js 的 debug 库设置环境变量:env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
我发现我必须删除“*”周围的引号才能使其工作:env DEBUG=* node some_file.js
@SamT 如何在 Ubuntu linux 中设置这些变量?
是否可以添加文件而不是添加大量 env 脚本,或者 unix 用户是否需要创建 bash 脚本?
@mibbit 是的,这就是 dotenv 的全部内容,因为它会读取您的 .env 文件并应用它。
c
ctrlplusb

我强烈建议查看 dotenv 包。

https://github.com/motdotla/dotenv

它有点类似于@Benxamin 的答案中建议的库,但它更干净,不需要任何 bash 脚本。另外值得注意的是,代码库很受欢迎并且维护得很好。

基本上你需要一个 .env 文件(我强烈建议从你的 git/mercurial/etc 中忽略它):

FOO=bar
BAZ=bob

然后在您的应用程序入口文件中尽早放入以下行:

require('dotenv').config();

繁荣。完毕。 'process.env' 现在将包含上述变量:

console.log(process.env.FOO);
// bar

'.env' 文件不是必需的,因此您不必担心您的应用程序在它不存在时会摔倒。


尽管如果您确实放置了您的应用程序需要的相关配置详细信息(例如这个问题正在询问),那么它可能会在没有它的情况下崩溃......但它似乎仍然是一个不错的选择。
如果您正在寻找额外的安全性,那么 github.com/rolodato/dotenv-safe 和一些测试应该可以做到。
如果您不想在您的应用程序中要求它:github.com/direnv/direnv
这意味着在 git repo 中提交你的秘密
我不建议这样做。这应该仅适用于您的本地环境,并且文件应该是 gitignore'd。 CI/CD 应该为其他环境注入环境变量。
S
Sebas

您可以通过进程全局变量设置环境变量,如下所示:

process.env['NODE_ENV'] = 'production';

适用于所有平台。


...环境变量旨在从代码外部设置,而不是在内部设置 - 所以这违背了目的并且是一个坏例子
@Soren 我们启动子进程的节点程序受益于这个答案,所以即使它有点不正统,也有一些用例
@pspi -- 我 99% 确定 你做错了,除非你是像 this 这样的 config package 的作者,否则你应该改用这样的配置包。
如果您在 js 中编写构建脚本并从 npm 运行它们,这将非常有用
这对于例如在运行测试时设置和覆盖环境也很有用。
p
palanik

只需在命令行上提供环境值

USER_ID='abc' USER_KEY='def' node app.js

只需添加它在带有 bash shell 的 Windows 上对我有用(cygwin;我认为安装了 git 工具)。
@TiborSzasz:Cygwin 或 Powershell 应该解决这个问题。当然,这是两年后提到的。
对于 Windows 使用:SET USER_ID='abc'
@Mike,您应该做出正确的回答:)
我们可以使用 cross-env 包 (npmjs.com/package/cross-env) 使其在 unix 或 windwos 上工作
E
Erik Gillespie

如果您想要管理选项,请尝试使用 envs npm 包。如果已设置,它将返回环境值。否则,您可以指定存储在全局默认对象变量中的默认值(如果它不在您的环境中)。

使用 .env ("dot ee-en-vee") 或环境文件有很多好处。个人可以管理自己的配置。您可以使用自己的环境设置将不同的环境(dev、stage、prod)部署到云服务。您可以设置合理的默认值。

在您的 .env 文件中,每一行都是一个条目,如下例所示:

NODE_ENV=development
API_URL=http://api.domain.com
TRANSLATION_API_URL=/translations/
GA_UA=987654321-0
NEW_RELIC_KEY=hi-mom
SOME_TOKEN=asdfasdfasdf
SOME_OTHER_TOKEN=zxcvzxcvzxcv

您应该在您的版本控制存储库中包含 .env(将其添加到您的 .gitignore 文件中)。

要将变量从 .env 文件获取到您的环境中,您可以在启动应用程序之前使用 bash 脚本执行 export NODE_ENV=development 的等效操作。

#!/bin/bash
while read line; do export "$line";
done <source .env

然后这进入您的应用程序javascript:

var envs = require('envs');

// If NODE_ENV is not set, 
// then this application will assume it's prod by default.
app.set('environment', envs('NODE_ENV', 'production')); 

// Usage examples:
app.set('ga_account', envs('GA_UA'));
app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY'));
app.set('other', envs('SOME_OTHER_TOKEN));

嗯,我尝试使用这个包,但它似乎只跟踪环境变量的使用。它不读取 .env 文件 (npmjs.com/package/envs)。它是一个正确的包吗?
你是对的!它不读取 .env 文件。这很尴尬。我忘记了我正在使用@SamT提到的bash脚本加载.env,所以它仍然有效。
“需要('envs')”?什么是“环境”?
“envs”是节点模块的名称:npmjs.com/package/envs
我还推荐使用“dotenv”模块,它把所有的 ENV 变量都放到了 proccess 对象中,顺便说一句很简洁。
W
WasiF

这取决于您的操作系统和外壳

在带有 shell bash 的 linux 上,您可以创建这样的环境变量(在控制台中):

export FOO=bar

有关 ubuntu 环境变量的更多信息(例如):

Environment variables on ubuntu


然后看到这个答案:stackoverflow.com/questions/135688/…
那么Windows呢?请问可以在这里补充吗?
啊,没关系,看起来这里已经回答了:stackoverflow.com/questions/9249830/…
在 Linux bash 中,这些值是否保持不变?如果我只想在终端打开时运行它,以便以后不会导致其他应用程序出现问题怎么办?
这非常适合我的需要 - 对于我的 npm install --save geo-ip,它需要环境键 = 值设置才能进行安装。
d
dipenparmar12

就像 ctrlplusb 说的,我建议你使用包 dotenv,但另一种方法是创建一个 js 文件并在应用服务器的第一行需要它。

环境.js:

process.env.VAR1="foo"
process.env.VAR2="bar"

应用程序.js:

require('./env') // env.js relative path.
console.log(process.env.VAR1) // foo

我收到错误提示错误:找不到模块“env”
它应该是 require('./env')
D
Drkawashima

Windows用户:注意!这些命令推荐用于 Unix,但在 Windows 上它们只是临时的。他们只为当前的 shell 设置一个变量,一旦你重新启动你的机器或启动一个新的终端 shell,它们就会消失。

设置测试="你好世界"

$env:TEST = "你好世界"

要在 Windows 上设置持久环境变量,您必须改用以下方法之一:

A) .env 文件在您的项目中 - 这是最好的方法,因为这意味着您可以将您的项目移动到其他系统,而无需在该系统上设置您的环境变量,然后您就可以运行您的代码。

在您的项目文件夹根目录中创建一个 .env 文件,其内容为: TEST="hello world" 编写一些将读取该文件的节点代码。我建议安装 dotenv ( npm install dotenv --save) 然后添加 require('dotenv').config();在您的节点设置代码期间。现在您的节点代码将能够访问process.env.TEST

Env 文件可以很好地保存 api 密钥和其他您不想在代码库中包含的秘密。只需确保将其添加到您的 .gitignore 中即可。

B) 使用 Powershell - 这将创建一个可在其他终端中访问的变量。但请注意,重新启动计算机后该变量将丢失。

[Environment]::SetEnvironmentVariable("TEST", "hello world", "User")

这种方法在 Windows 论坛上被广泛推荐,但我认为人们不知道该变量在系统重启后不会持续存在......

C) 使用 Windows GUI

在开始菜单搜索或控制面板中搜索“环境变量”选择“编辑系统环境变量”将打开一个对话框。单击对话框底部的“环境变量”按钮。现在你有了一个编辑变量的小窗口。只需单击“新建”按钮即可添加新的环境变量。简单的。


B
Blairg23

第 1 步:将您的环境变量添加到相应的文件中。例如,您的暂存环境可以称为 .env.staging,其中包含特定于您的暂存环境的环境变量 USER_IDUSER_KEY

第 2 步:在您的 package.json 文件中,添加以下内容:

"scripts": {
  "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'",
  "build:staging": "REACT_APP_ENV=staging npm run build",
  "build:production": "REACT_APP_ENV=production npm run build",
  ...
}

然后在你的部署脚本中调用它,如下所示:

npm run build:staging

超级简单的设置,就像一个魅力!

来源: https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d


@JohnXiao 怎么样?
C
Community

对于 Windows 用户,这个 Stack Overflow 问题和最佳答案对于如何通过命令行设置环境变量非常有用

How can i set NODE_ENV=production in Windows?


S
Sean McClory

遇到了一个很好的工具来做到这一点。

node-env-file

将环境文件(包含 ENV 变量导出)解析并加载到 Node.js 环境中,即 process.env - 使用此样式:

.env

# some env variables

FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=

D
Daniel Danielecki

使用 dotenv-webpack 让您的生活更轻松。只需安装它 npm install dotenv-webpack --save-dev,然后在应用程序的根目录中创建一个 .env 文件(记得在 git push 之前将它添加到 .gitignore)。打开这个文件,并在那里设置一些环境变量,例如:

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

现在,在你的 webpack 配置中添加:

const Dotenv = require('dotenv-webpack');
const webpackConfig = {
  node: { global: true, fs: 'empty' }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  },
  plugins: [new Dotenv()]
};
module.exports = webpackConfig; // Export all custom Webpack configs.

只需要 const Dotenv = require('dotenv-webpack');plugins: [new Dotenv()],当然还有 module.exports = webpackConfig; // Export all custom Webpack configs.。但是,在某些情况下,您可能会遇到一些错误。对于这些,您也有解决方案,这意味着您可以如何修复某些错误。

现在,您可以在您的应用程序中简单地使用 process.env.ENV_VAR_1process.env.ENV_VAR_2process.env.ENV_VAR_3


T
TacoEater

如果您使用的是 mac/linux,并且您想检索您正在使用的机器的本地参数,您将执行以下操作:

在终端运行 nano ~/.bash_profile 添加一行:export MY_VAR=var save & run source ~/.bash_profile in node use like:console.log(process.env.MY_VAR);


这正是我想要的。谢谢
s
simonepri

作为@ctrlplusb 答案的扩展,
我建议您也看看 env-dot-prop 包。

它允许您使用 dot-pathprocess.env 设置/获取属性。

假设您的 process.env 包含以下内容:

process.env = {
  FOO_BAR: 'baz'
  'FOO_🦄': '42'
}

然后你可以像这样操作环境变量:

const envDotProp = require('env-dot-prop');

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42'}

envDotProp.get('foo');
//=> {bar: 'baz', '🦄': '42'}

envDotProp.get('foo.🦄');
//=> '42'

envDotProp.get('foo.🦄', {parse: true});
//=> 42

envDotProp.set('baz.foo', 'bar');
envDotProp.get('', {parse: true});
//=> {foo: {bar: 'baz', '🦄': 42}, baz: {foo: 'bar'}}

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42', BAZ_FOO: 'bar'}

envDotProp.delete('foo');
envDotProp.get('');
//=> {baz: {foo: 'bar'}}

console.log(process.env);
//=> {BAZ_FOO: 'bar'}

这可以帮助您解析环境变量并将它们用作应用程序中的配置对象。
它还可以帮助您实现 12-factor configuration


M
Manohar Reddy Poreddy

我成功使用的一个很好的环境变量方法如下:

A. 有不同的配置文件:

dev.js // 这包含所有仅用于开发的环境变量 该文件包含: module.exports = { ENV: 'dev', someEnvKey1 : 'some DEV Value1', someEnvKey2 : 'some DEV Value2' }; stage.js // 这具有仅用于开发的所有环境变量 .. qa.js // 这具有仅用于 qa 测试的所有环境变量 该文件包含: module.exports = { ENV: 'dev', someEnvKey1 : 'some QA Value1 ', someEnvKey2 : '一些 QA Value2' };

注意:这些值主要随环境而变化,但键保持不变。

你可以有更多的 z__prod.js // 这有所有的环境变量只用于生产/实时 注意:这个文件永远不会捆绑部署将所有这些配置文件放在 /config/ 文件夹 /config/dev.js /config/qa.js /config/z__prod.js /setenv.js /setenv.bat /setenv.sh

注意: prod 的名称与其他名称不同,因为它不会被所有人使用。

B. 从配置文件中设置 OS/ Lambda/ AzureFunction/ GoogleCloudFunction 环境变量

现在理想情况下,文件中的这些配置变量应该作为操作系统环境变量(或者,LAMBDA 函数变量,或者,Azure 函数变量,谷歌云函数等)

所以,我们在 Windows 操作系统(或其他)中编写自动化

假设我们编写'setenv' bat 文件,它接受一个参数,即我们要设置的环境现在运行“setenv dev”

a)这从传递的参数变量(现在为'dev')获取输入 b)读取相应的文件('config\dev.js') c)在 Windows 操作系统(或其他)中设置环境变量

例如,

setenv.bat 内容可能是:

    node setenv.js

setenv.js 的内容可能是:

    // import "process.env.ENV".js file (dev.js example)
    // loop the imported file contents
    //     set the environment variables in Windows OS (or, Lambda, etc.)

就是这样,您的环境已经可以使用了。

当您执行“setenv qa”时,所有 qa 环境变量都可以从 qa.js 中使用,并可供同一程序使用(它总是要求 process.env.someEnvKey1,但它得到的值是 qa one)。

希望有帮助。


o
omencat

设置系统环境变量后,我变得不确定。当我将 APP_VERSION 放入 User env var 时,我可以通过 process.env.APP_VERSION 显示来自节点的值


e
emrhzc

如果您使用 Visual Studio 代码调试功能,您可以添加 "envFile": "${workspaceRoot}/.env" 来启动配置。这样你就不必使用 dotenv。

{
        "cwd": "${workspaceRoot}",
        "command": "npm start",
        "name": "Run be",
        "request": "launch",
        "type": "node-terminal",
        "envFile": "${workspaceRoot}/.env"
},

J
Jonatas Walker

与其他一些答案非常相似,但没有任何库或(bash)export

我有一些加密变量,然后我需要动态生成它们。

魔术发生在 set -a && ... && set +a 上,它可以是一些内容或文件。

#!/bin/sh

set -a    
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a

# or
set -a && . ./file && set +a

我有一个 docker-entrypoint.sh

#!/bin/sh

node app/config/set-environment.js

ENVFILE=/tmp/.env

if [[ ! -f "$ENVFILE" ]] ; then
    echo "File $ENVFILE is not there, aborting."
    exit
fi

# here is where things happen
set -a && . $ENVFILE && set +a

if [ "${NODE_ENV}" = "development" ]; then
  npx nodemon app/server.js
else
  node app/server.js
fi

exec "$@"

set-environment.js 生成 (tmp) .env 文件


P
Pawel

使用跨环境。它将为您省去很多麻烦

npm i -S cross-env

cross-env PARAM=value node ./index.js

这通常对非凭据有好处。对于凭据和密钥之类的东西,最好不要存储硬编码的用户 ID 和密码,而是使用不在 repo 和 dotenv 中的 .env 文件