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

时间:2017-04-13 17:01:34

标签: javascript json node.js

我有一个后端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];
});

还有另一种好办法吗?没有env变量?

在JSON中包含某种可由文件读者解释的变量的最佳方法是什么?

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

3 个答案:

答案 0 :(得分:1)

似乎这是处理此类情况的最佳方式。使用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": []
   }

它是通用的,因此它可以处理其他env变量,而不仅仅是$ HOME变量。这是这里的重大胜利。

答案 1 :(得分:1)

出于这个原因,我使用.js文件而不是.json作为配置。举个例子......文件名为config.js,代码如下。

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

答案 2 :(得分:0)

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