ES6从文件内容中插入字符串

时间:2016-09-20 01:07:12

标签: javascript node.js ecmascript-6

我遇到了ES6中的String interpolation功能。如果我在代码中定义原始字符串,它就有效。但我想从文件中读取原始字符串,然后替换占位符。怎么做?

file.txt的

   hello ${customer.name} 

节点JS

   var customer = {name: 'sid'};
   var data = fs.readFileSync("file.txt","utf8");
   // what should go here so that data is 'Hello sid'?

4 个答案:

答案 0 :(得分:3)

唯一的方法是escape文件中的模板字符串并稍后生成eval,有关详细信息,请参阅this question

答案 1 :(得分:3)

您可以构建单行而不是加载模板引擎。这将使用来自对象的值替换$ {field}。

var obj = {a: 'one', b: 'two'};
var templ = '${a}, ${b}';

templ.replace(/\${([^}]*)}/g, (r,k)=>obj[k]);

//  'one, two'

答案 2 :(得分:2)

我决定选择es6-template-strings,因为它似乎很直接。 Petr的使用eval的建议也有效,但我对项目使用eval有一些限制

var data = fs.readFileSync("file.txt","utf8");
var compiled = compile(data);
var content = resolveToString(compiled, customer);

答案 3 :(得分:0)

从@John Williams 的帖子中汲取了很多灵感,您仍然可以通过向 regex-replace 添加拆分和化简器来在一行中完成此操作,以便您可以使用嵌套对象。

var obj = {a: 'one', b:{b1:"Bravo-1",b2:'Bravo-2'},c:{c1:{c2:"Charlie-2"}}};
var templ = '${a}, ${b.b1}, ${b.b2}, ${c.c1.c2}';

console.log(templ.replace(/\${([^}]*)}/g, (r,k)=>k.split(".").reduce((acc,cur)=>acc[cur],obj)));