我有一个nodejs应用,该应用接收一个带有字符串模板的json对象。目前,我正在使用string-template软件包来填充模板:
{
"template": "https://example.com/{value}/{index}",
}
模板具有许多可用的值。有些会改变一些不会。我希望能够对模板中的值进行简单的数学运算,如下所示:
{
"template": "https://examplesite.com/{index * 2}
}
这里的安全性很重要,因此我要避免在模板中添加任何eval
子句。是否可以以安全的方式在JavaScript字符串中进行简单的数学运算(+
,-
,/
,*
,^
)?
答案 0 :(得分:0)
从文档中看,字符串模板似乎不支持模板内部的表达式。
假设您想将“索引”中输入的任何值加倍。进行格式化时,您需要将该值加倍:
var foo = {
"template": "https://examplesite.com/{index}"
}
format(foo.template, {
index: index * 2
})
另一个选择可能是使用javascript内置的模板字符串,并包装在函数中:
function renderTemplate(index) {
return `https://examplesite.com/${index * 2}`
}
您可以在这些模板中放置任何表达式。
答案 1 :(得分:0)
我使用Handlebars找到了解决问题的方法。
import Handlebars from 'handlebars'
Handlebars.registerHelper('+', (x, y) => x + y)
Handlebars.registerHelper('-', (x, y) => x - y)
Handlebars.registerHelper('*', (x, y) => x * y)
Handlebars.registerHelper('/', (x, y) => x / y)
const createTemplate = (templateStr) => {
const template = Handlebars.compile(templateStr)
return (data) => template(data)
}
使用方法
createTemplate("test {{'+' val 2}}")({ val: 13 }) // yields 15
这完全可以满足我的需要,甚至可以解决嵌套的数学问题
createTemplate("test {{'*' ('+' val 2) 3}}")({ val: 13 }) // yields 45