Динамическое создание маршрутов с помощью Express и шаблона EJS из ответа JSON

У меня есть несколько продуктов, и я хотел бы динамически создать маршрут для каждого из них, поэтому, когда я добавляю продукт в CMS, который я выполняю вызовом API, чтобы получить JSON, он автоматически создает страницу вместо ее ручного кодирования.

JSON Tree

Экспресс:

var scopedEntries;

//get contentful entries
client.getEntries() //get entries
.then(function (entries){
  scopedEntries = entries; //assigning globally to later pass into routes
  console.log(entries.items[0].fields.companyName); //log data
}); // end of promise

router.get('/test:id', function (req, res) {
  //console.log(scopedEntries);
  res.render('test' + req.params.id, {
    entries: scopedEntries
    });
  });

Пример шаблона:

<html>
  <head>
    <title>TEST APP</title>
  </head>
  <body>
    <h1><%= entries.items[0].fields.companyName %></h1>
    <h2><%= entries.items[1].fields.productName %></h2>
    <p>Description: <%= entries.items[1].fields.productDescription %></p>
    <p>Size: <%= entries.items[1].fields.sizetypecolor %></p>
    <p>Price: <%= entries.items[1].fields.price %></p>
    <p>SKU: <%= entries.items[1].fields.productDescription %></p>
    <img src="<%= entries.includes.Asset[0].fields.file.url %>" alt="" />
  </body>
</html>

В идеале, в ответе JSON есть страница для каждого элемента, и она динамически создается с использованием EJS в экспресс-маршруте. Как бы я сделал это правильно.

Кроме того, JSON не является окончательным JSON. Схема еще не полностью заполнена, поэтому мне нужно будет адаптировать ее к моему дереву.

2 ответа

Решение

Вы, вероятно, не хотите создавать новый маршрут для каждого продукта. Возможно, вы хотите создать единый маршрут, который будет обрабатывать все ваши продукты, а затем указать параметр в вашем маршруте (либо часть маршрута, либо параметр запроса), который сообщит единственному обработчику маршрута, какой продукт он должен показать.

Как именно это сделать, зависит от общего дизайна URL вашего сайта. Но вы могли бы иметь маршрут для /product/view/:productName, или же /product/view/:productID и иметь один обработчик маршрута, который обрабатывает все ваши продукты. Если кто-то входит в productName или же productID этого не существует, тогда вы просто сделали бы хорошую страницу 404.

Ваш один обработчик маршрута для этого маршрута извлечет productName или productID (в зависимости от того, для чего вы хотите создать) из URL, а затем просмотрите всю соответствующую информацию об этом продукте в вашей базе данных. Затем он поместит все эти данные в структуру данных (вероятно, объект с большим количеством свойств) и затем передаст эту структуру данных res.render(templateName, data), Затем механизм шаблонов поместит данные в сгенерированную HTML-страницу, как указано в вашем шаблоне.

Если некоторые продукты отображают различные типы информации, то ваш шаблон должен быть расширенным набором всего, что нужно отображать, и вы кодируете шаблон для отображения различной информации в зависимости от того, присутствует она или нет в данных, переданных в res.render(),

использовать параметры маршрута. Путь маршрута: /flights/:from-:to URL запроса: http://localhost:3000/flights/LAX-SFO req.params: { "from": "LAX", "to": "SFO" }

Другие вопросы по тегам