Я не уверен, является ли использование eval в этой ситуации допустимым или есть более хорошее решение моей проблемы.У меня небольшой опыт работы с nodejs.
У меня есть простая лямбда-функция AWS, написанная на nodejs, которая просто должна возвращать длинный JSON-документ, содержащий некоторые переменные поля, определенные в функции.
Iхочу иметь файл шаблона, содержащий JSON с некоторыми переменными.Предположим, что он называется template.json.js
и имеет следующее содержимое:
{
"key": "Some static key",
"name": "Example",
"description": "Blah Blah",
"url": URL
}
В этом простом примере URL
следует заменить некоторым значением переменной.Скажем, с переменной окружения.
Файл шаблона полностью безопасен, так как я читаю его из файла, и редактировать его могут только программисты.
Так что самый простой подход, который я придумал, этопросто запустив шаблон с eval
в моей лямбда-функции.Вот так:
'use strict';
const fs = require('fs');
let response;
function renderTemplate() {
// template variables
var URL = "" + process.env.BASE_URL;
// render template
let jsonFile = fs.readFileSync('template.json.js').toString();
return eval('(' + jsonFile + ')');
}
exports.lambdaHandler = async (event, context) => {
try {
response = {
'statusCode': 200,
'body': JSON.stringify(renderTemplate())
}
} catch (err) {
console.log(err);
return err;
}
return response
};
Что работает довольно хорошо.
Что мне нравится в этом подходе
- Это легко реализовать и понять
- Никаких дополнительных библиотек не требуется
- Это быстро
- Работает со строками, Int, массивами и объектами
- Правильно обрабатывает специальные символы
- InПо моему мнению, это должно быть безопасно, если я правильно ввожу проверку ввода пользователя (String или Int)
Почему меня не устраивает такой подход
- Нет разделения контекста (все доступно из шаблона, включая функции)
- Все, что использует
eval
вызывает у меня плохое настроение - Я не уверен, что неткакой-то порочный способ использовать пользовательский ввод даже после правильной проверки типа, что ввод является строкой