Nodejs, шаблонизатор JSON, eval - PullRequest
0 голосов
/ 04 декабря 2018

Я не уверен, является ли использование 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 вызывает у меня плохое настроение
  • Я не уверен, что неткакой-то порочный способ использовать пользовательский ввод даже после правильной проверки типа, что ввод является строкой
...