Выполнять математические операции внутри статических шаблонных строк - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение nodejs, которое принимает объект json с шаблонами строк внутри него.В настоящее время я использую пакет string-template для заполнения шаблонов:

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

Шаблоны имеют ряд доступных значений.Некоторые изменится, некоторые из них.Я хочу иметь возможность выполнять простые математические операции над значениями в шаблоне, например, так:

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

Безопасность важна здесь, поэтому я хочу избегать добавления любых предложений eval в шаблоны.Можно ли безопасно выполнять простые математические операции (+, -, /, *, ^) в строках javascript?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я нашел решение своей проблемы с помощью Рули .

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
0 голосов
/ 04 октября 2018

Из документов не похоже, что string-template поддерживает выражения внутри шаблонов.

Допустим, вы хотели удвоить любое значение, попавшее в «index».Вам потребуется удвоить это значение при выполнении форматирования:

var foo = {
  "template": "https://examplesite.com/{index}"
}

format(foo.template, {
    index: index * 2
})

Другой вариант может заключаться в использовании встроенных в шаблон строк javascript, заключенных в функцию:

function renderTemplate(index) {
  return `https://examplesite.com/${index * 2}`
}

Вы можете поставитьлюбое выражение внутри этих шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...