首页 > 解决方案 > 从代码中设置的 env 变量在 node.js 的导入模块中不可用

问题描述

如何在代码中设置环境变量,以便它们在导入的 NPM 模块中可用?

一个简短的例子:

index.js

const supportsHyperlinks = require('supports-hyperlinks');

process.env.FORCE_HYPERLINK = 1;
console.log(supportsHyperlinks.stdout); // false; process.env.FORCE_HYPERLINK is undefined inside 

node_modules/supports-hyperlinks/index.js

'use strict';

function supportsHyperlink(stream) {
    const {env} = process;

    console.log(env.FORCE_HYPERLINK); // returns false

    if ('FORCE_HYPERLINK' in env) {
        return !(env.FORCE_HYPERLINK.length > 0 && parseInt(env.FORCE_HYPERLINK, 10) === 0);
    }

    ...
}

module.exports = {
    supportsHyperlink,
    stdout: supportsHyperlink(process.stdout),
    stderr: supportsHyperlink(process.stderr)
};

似乎每个 NPM 模块都有自己的process.env对象。

标签: javascriptnode.js

解决方案


这是一个时间问题,与是否使用通过 NPM 安装的模块无关。


const supportsHyperlinks = require('supports-hyperlinks');

首先,您需要导致它运行的模块。


module.exports = {
    supportsHyperlink,
    stdout: supportsHyperlink(process.stdout),
    stderr: supportsHyperlink(process.stderr)
};

然后填充导出,包括stdout函数的返回值。

该功能记录env.FORCE_HYPERLINK 当前未设置


process.env.FORCE_HYPERLINK = 1;

然后你设置env.FORCE_HYPERLINK


console.log(supportsHyperlinks.stdout); // false; process.env.FORCE_HYPERLINK is undefined inside

最后,您读取了先前分配给 的值stdout


您需要在设置环境变量后调用该函数。

您可以将其设置为导出对象的 getter 函数,以便每次访问时都会调用它.stdout

module.exports = {
    supportsHyperlink,
    get stdout() { return supportsHyperlink(process.stdout) },
    get stderr() { return supportsHyperlink(process.stderr) },
};

推荐阅读