在静态模板字符串内执行数学运算

时间:2018-10-03 21:05:40

标签: javascript string templates

我有一个nodejs应用,该应用接收一个带有字符串模板的json对象。目前,我正在使用string-template软件包来填充模板:

{
  "template": "https://example.com/{value}/{index}",
}

模板具有许多可用的值。有些会改变一些不会。我希望能够对模板中的值进行简单的数学运算,如下所示:

{
  "template": "https://examplesite.com/{index * 2}
}

这里的安全性很重要,因此我要避免在模板中添加任何eval子句。是否可以以安全的方式在JavaScript字符串中进行简单的数学运算(+-/*^)?

2 个答案:

答案 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