Javascript 在静态JSON配置文件中表示动态路径变量

Javascript 在静态JSON配置文件中表示动态路径变量,javascript,json,node.js,Javascript,Json,Node.js,我有一个后端CLI实用程序的JSON配置: { "searchRoots": ["$HOME"], "list": [] } 如果我用JavaScript实现这一点,我会: module.exports = { searchRoots": [process.env.HOME], list: [] }; 使用JSON而不是JS的问题在于,我无法以编程方式引用环境变量或任何变量。实际上,所有内容都是硬编码的 因此,我将在Node.js代码中执行以下操作: const conf

我有一个后端CLI实用程序的JSON配置:

{
  "searchRoots": ["$HOME"],
  "list": []
}
如果我用JavaScript实现这一点,我会:

module.exports = {
   searchRoots": [process.env.HOME],
   list: []
};
使用JSON而不是JS的问题在于,我无法以编程方式引用环境变量或任何变量。实际上,所有内容都是硬编码的

因此,我将在Node.js代码中执行以下操作:

const conf = require('./conf.json');

const searchRoots = conf.searchRoots.map(function(item){
   return process.env[item];
});
还有别的好办法吗?没有环境变量

在JSON中包含某种可以由文件读取器解释的变量的最佳方式是什么


有没有办法通过Node.js对路径进行bash风格的解释?

如果你的库结构正确,它应该有一个方法来更新你的变量,或者你应该能够访问你的全局变量,只要该变量是同一环境的一部分。您可以查看有关访问本地和全局变量的任何文档或JS书籍。

似乎这是处理此类情况的最佳方法。使用bash样式的路径解释,并从流程中调用bash

使用JSON配置文件,如下所示:

{
  "searchRoots": ["$HOME"],
  "list": []
}
您可以编写这样的例程,它将使用bash解释字符串,并将它们转换为绝对路径:

searchRoots: function (cb) {

    const mappedRoots = searchRoots.map(function (v) {
      return `echo "${v}";`;
    });

    const k = cp.spawn('bash');

    k.stdin.write('\n' + mappedRoots + '\n');

    process.nextTick(function () {
      k.stdin.end();
    });

    const data = [];
    k.stderr.pipe(process.stderr);

    k.stdout.on('data', function (d) {
      data.push(d);
    });

    k.once('close', function (code) {
      if (code > 0) {
        return cb({
          code: code
        });
      }
      cb(null, data.map(function (d) {
        return String(d).trim();
      }));
    });
  },
这将原始数据转换为:

  {
      "searchRoots": ["/Users/YourHomeDir"],
      "list": []
   }

它是通用的,所以它可以处理其他环境变量,而不仅仅是$HOME变量。这是最大的成功。

正是因为这个原因,我在配置中使用了.js文件而不是.json文件。所以作为一个例子。。。该文件名为config.js,包含以下代码

module.exports = {
    "searchRoots": [ process.env.HOME ],
    "list": []
}

很抱歉,这个答案对我来说没有任何意义,我只是在问题中添加了一些更相关的细节。请注意,您的searchRoots的值是一个数组。您可能正在查看process.env[item[0]]或jsonObject.searchRoots[0]。看看这两个链接,是的,在这种情况下,我想使用JSON,但也许我也可以允许使用JS