Ada*_*tan 5 asynchronous environment-variables node.js
使用process.env对象完成在Node.js中的读写环境变量。
例如:
process.env.foo 计算为env var fooprocess.env.bar = 'blah'将envvar 的值设置bar为blahdelete process.env.baz 删除环境变量 baz从反复试验和缺少回调的角度出发,我认为这些操作是同步的,但是我没有找到对它的引用process.env文档。
envvar访问在Node.js中是同步还是异步?
附录:为什么我认为这个问题很重要
遵循以下注释:读写环境变量可能意味着该进程需要与操作系统进行通信,或执行某种阻塞的I / O操作。
因此,有必要询问是否将环境变量作为本地对象存储在内存中而不进行任何同步,或者是否以阻塞方式发送给操作系统。
此外,操作系统之间的实现可能会有所不同,并且官方文档对无阻塞操作没有任何承诺。
我认为“同步”/“异步”可能有点误导。
我想真正的问题是:读取或写入process.env昂贵吗?它是否对操作系统执行阻塞操作?
简短的回答是肯定的,它可能很贵。
有关更多背景信息及其对某些应用程序的影响程度,请参阅此 GitHub 问题。那里已经声明应该更新文档以明确说明process.env2015 年的访问速度很慢,但还没有发生。
您实际上可以在 node.js 源代码中看到它的实现process.env,很明显,任何访问都将调用从这里开始定义的函数之一。
根据平台的不同,这可能会产生或多或少的影响。
这在 Windows 上变得最明显,因为您可以从外部查看进程的当前环境(而在 Linux 中,/proc/.../environ当环境更改时,文件将保留其原始内容setenv)。
例如:
node -e "process.env.TEST = '123'; setInterval(() => {}, 1000);";
Run Code Online (Sandbox Code Playgroud)
这将启动一个节点进程,TEST该进程在当前进程的环境中创建一个环境变量,然后永远等待。
现在我们可以打开Process Explorer或Process Hacker之类的工具,查看node进程的环境:
瞧,变量就在那里。这以另一种方式证明了写入process.env确实访问了操作系统。
此外,因为该对象实际上从操作系统查询所有数据,这意味着它的行为甚至与普通对象不同。同样,Windows 示例(因为它最古怪):
Windows 匹配不区分大小写的环境变量。
> process.env.TEST = '123'
'123'
> process.env.tEsT
'123'
Run Code Online (Sandbox Code Playgroud)Windows 具有隐藏的环境变量,=以无法通过正常方式更改且未枚举的环境变量开头。node.js 复制了这些语义。这些=X:变量特别代表特定驱动器中的当前目录(是的,Windows 将它们存储在每个驱动器中)。
> Object.keys(process.env).filter(k => k === '=Z:')
[]
> process.env['=Z:']
'Z:\\'
> process.env['=Z:'] = 'Z:\\Temp'
'Z:\\Temp'
> process.env['=Z:']
'Z:\\'
> process.chdir('Z:\\Temp')
undefined
> process.env['=Z:']
'Z:\\Temp'
Run Code Online (Sandbox Code Playgroud)现在,有人可能会认为(类似于我链接的 GitHub 问题中提出的内容)node.js 应该只缓存process.env在一个实际对象中,并且为了创建子进程,从缓存的对象中读取环境。由于以下原因,不建议这样做:
chdir并尝试自动更新=X:受影响驱动器的相关变量(如果本机插件会更改当前目录,它将不起作用) ,或者仅针对某些变量访问操作系统,这对于隐藏的错误存在着疯狂和巨大的潜力。这也应该解释为什么process.env = JSON.parse(JSON.stringify(process.env))在你的代码中这样做是个坏主意。一方面,它会打破 Windows 上的不区分大小写(你不可能知道其他模块需要哪些模块可能取决于它),除此之外,它当然会导致大量其他问题,如上所述。
小智 -1
实际上它是一个普通的对象,可以让你获取当前进程的环境变量,毕竟它们只是一些用于对程序进行一些设置的变量。Nodejs只是在nodejs程序读取它们后为它们设置一个普通对象。虽然文档没有写它们,但它写了 this is an object 和以下内容:
可以修改此对象,但此类修改不会反映在 Node.js 进程之外。换句话说,下面的例子是行不通的:
Run Code Online (Sandbox Code Playgroud)$ node -e 'process.env.foo = "bar"' && echo $foo虽然以下内容将:
Run Code Online (Sandbox Code Playgroud)process.env.foo = 'bar'; console.log(process.env.foo);在 process.env 上分配属性会隐式地将值转换为字符串。
这足以解释你的问题了。
| 归档时间: |
|
| 查看次数: |
1597 次 |
| 最近记录: |