У меня есть приложение nodejs, которое принимает объект json со строковыми шаблонами внутри него. В настоящее время я использую пакет строка-шаблон для заполнения шаблонов:
{
"template": "https://example.com/{value}/{index}",
}
В шаблонах есть несколько доступных значений. Некоторые изменят некоторые привычки. Я хочу иметь возможность выполнять простые математические операции со значениями в шаблоне, например:
{
"template": "https://examplesite.com/{index * 2}
}
Здесь важна безопасность, поэтому я не хочу добавлять в шаблоны какие-либо предложения eval. Можно ли безопасно выполнять простые математические операции (+, -, /, *, ^) в строках javascript?
@ChristianScott, я редактировал вопрос (использую строка-шаблон)
AFAIK это просто статическая вещь - вам нужно будет передать объект с предварительно вычисленными значениями: «Простая функция строкового шаблона, основанная на именованных или индексированных аргументах». Он не выполняет код (опять же, AFAIK). Возможно, вам понадобится другой шаблонизатор, если вы хотите выполнять код.
да, то же самое касается того, что я знаю. Я надеюсь, что кто-то знает хорошее чистое решение с другим существующим языком шаблонов. Лучшее, что я смог найти самостоятельно, было воск для усов



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из документации не похоже, что строковый шаблон поддерживает выражения внутри шаблонов.
Допустим, вы хотите удвоить любое значение, входящее в «индекс». Вам нужно будет удвоить это значение при форматировании:
var foo = {
"template": "https://examplesite.com/{index}"
}
format(foo.template, {
index: index * 2
})
Другой вариант может заключаться в использовании встроенных в javascript строк шаблона, заключенных в функцию:
function renderTemplate(index) {
return `https://examplesite.com/${index * 2}`
}
Вы можете поместить любое выражение в эти шаблоны.
Литералы шаблонов ES6 раскрываются немедленно, вы не можете использовать их для генерации вывода из динамических данных. Вы также не можете читать шаблон динамически.
Мне нужно, чтобы логика была перенесена в шаблоны, приложение будет использовать разные шаблоны, и некоторые из них могут нуждаться в математических операциях, а другие нет. Что касается встроенных строк шаблона, шаблоны необходимость должны храниться в json, поэтому использование в них javascript не является вариантом
Я нашел решение своей проблемы с помощью Рули.
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
Какую библиотеку вы используете? Это не встроенный стиль строк шаблона.