tak*_*aks 7 node.js node-modules
我想在节点js中更新我的环境变量,但我无法更新它的环境变量,我尝试过console.log(process.env.DB_HOST),但仍然得到旧值,在这里我添加了我的整个代码,任何人都可以查看它,并且帮我解决这个问题,
function exec_api() {
return new Promise(async function (resolve) {
const execSync = require('child_process').exec;
//let child_process_obj = execSync('DB_HOST='+process.env.UNITTEST_DB_HOST+' DB_DATABASE='+process.env.UNITTEST_DB_DATABASE+' DB_USERNAME='+process.env.UNITTEST_DB_USERNAME+' DB_PASSWORD='+process.env.UNITTEST_DB_PASSWORD+' PORT='+process.env.UNITTEST_SERVICE_PORT+' ./node_modules/.bin/nodemon main.js');
await execSync('export DB_HOST=' + process.env.UNITTEST_DB_HOST);
await execSync('export DB_DATABASE=' + process.env.UNITTEST_DB_DATABASE);
await execSync('export DB_USERNAME=' + process.env.UNITTEST_DB_USERNAME);
await execSync('export DB_PASSWORD=' + process.env.UNITTEST_DB_PASSWORD);
await execSync('export PORT=' + process.env.UNITTEST_API_BACKEND_PORT);
let child_process_obj = await execSync('node main.js');
unittest_api_backend_process_id = child_process_obj.pid;
resolve(true);
});
}
Run Code Online (Sandbox Code Playgroud)
要更改、添加或删除环境变量,请使用process.env. 以下是显示其工作原理的测试代码:
在main.js中:
console.log(process.env.DB_DATABASE);
Run Code Online (Sandbox Code Playgroud)
在exec.js中:
const execSync = require ('child_process').execSync;
process.env.DB_DATABASE = 'foo'; // this is ALL you need to do
console.log(execSync('node main.js').toString('utf8'));
Run Code Online (Sandbox Code Playgroud)
有了上面的两个文件,如果你运行你会在控制台中node exec.js看到打印出来的内容。foo这是打印出来的,main.js它继承了来自 的环境exec.js。
所以你需要在代码中做的就是:
function exec_api() {
return new Promise(function (resolve) {
const exec = require('child_process').exec;
// The following is node.js equivalent of bash "export":
process.env.DB_HOST = process.env.UNITTEST_DB_HOST;
process.env.DB_DATABASE = process.env.UNITTEST_DB_DATABASE;
process.env.DB_USERNAME = process.env.UNITTEST_DB_USERNAME;
process.env.DB_PASSWORD = process.env.UNITTEST_DB_PASSWORD;
process.env.PORT = process.env.UNITTEST_SERVICE_PORT;
let child_process_obj = exec('node main.js', {
stdio: ['inherit', 'inherit', 'inherit']
});
unittest_api_backend_process_id = child_process_obj.pid;
resolve(true);
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您希望承诺在main.js结束时返回,您需要执行以下操作:
function exec_api() {
return new Promise(function (resolve) {
const exec = require('child_process').exec;
// The following is node.js equivalent of bash "export":
process.env.DB_HOST = process.env.UNITTEST_DB_HOST;
process.env.DB_DATABASE = process.env.UNITTEST_DB_DATABASE;
process.env.DB_USERNAME = process.env.UNITTEST_DB_USERNAME;
process.env.DB_PASSWORD = process.env.UNITTEST_DB_PASSWORD;
process.env.PORT = process.env.UNITTEST_SERVICE_PORT;
let child_process_obj = exec('node main.js', {
stdio: ['inherit', 'inherit', 'inherit']
});
unittest_api_backend_process_id = child_process_obj.pid;
child_process_obj.on('exit', () => resolve(true));
// ^^^ Cannot use `await` as the API is not promise based
// but event based instead.
});
}
Run Code Online (Sandbox Code Playgroud)
export不起作用的完整解释在unixen上,环境变量,甚至包括当前工作目录、根目录(可以通过chroot更改)等在内的整个环境都不是shell的功能。它们是流程的特征。
我们可能熟悉export一些 shell 为子进程设置环境变量的语法,但这就是 shell 的语法。它与环境变量本身无关。例如,C/C++ 不使用export而是使用setenv()函数设置环境变量(实际上,内部这就是 bash/sh/ksh 等在实现时所做的事情export)。
在node.js中,读取和设置环境变量的机制是via process.env。
这不仅仅是一个 Node.js 问题。它在 bash 中也不起作用:
在exporter.sh中:
#! /bin/bash
export DB_DATABASE=$1
Run Code Online (Sandbox Code Playgroud)
在exec.sh中:
#! /bin/bash
./exporter.sh foo
echo $DB_DATABASE ;# does not print "foo"
Run Code Online (Sandbox Code Playgroud)
这是unixen的一个核心安全特性:不应该允许其他用户扰乱你的进程。在环境情况下执行此策略的方式是,只有父进程可以设置子进程的环境。子进程不允许设置父进程的环境。假设子进程属于父进程,因此应该允许您对程序执行您想要的操作 - 但由于父进程(您)不属于子进程,因此不允许子进程乱搞父母的环境。
这就是为什么您尝试使用export不起作用的原因。它实际上有效(变量确实是在子 shell 中创建的),但不允许更改其父进程(node.js 进程)的环境
| 归档时间: |
|
| 查看次数: |
6833 次 |
| 最近记录: |