我有一个后端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风格的解释?
答案 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书籍。