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

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

Дерево JSON

Выражать:

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. Схема еще не полностью заполнена, поэтому мне нужно будет адаптировать ее к моему дереву.


person Quesofat    schedule 07.03.2017    source источник
comment
Вы, вероятно, не хотите создавать маршрут для каждого продукта. Вероятно, вы хотите создать единый маршрут, который обрабатывает все ваши продукты, а затем указать параметр в вашем маршруте (либо часть маршрута, либо параметр запроса), который сообщает обработчику одного маршрута, какой продукт он должен показывать.   -  person jfriend00    schedule 08.03.2017
comment
Спасибо за комментарий! В частности, как бы я это сделал?   -  person Quesofat    schedule 08.03.2017
comment
Чтобы сделать то, что я предложил выше, нам нужно понять общий дизайн вашего URL-адреса для сайта, чтобы мы могли точно предложить, как вписать параметр продукта в структуру URL-адреса.   -  person jfriend00    schedule 08.03.2017
comment
И можно ли использовать IDS в качестве названий продуктов   -  person Quesofat    schedule 08.03.2017
comment
Представьте, если бы тестовый маршрут был /product/:ID   -  person Quesofat    schedule 08.03.2017
comment
Это действительно зависит от вашего общего дизайна URL. Но вы могли бы иметь /product/view/:productName. или /product/view/:productID и иметь один обработчик маршрута, который обрабатывает все ваши продукты. Если кто-то введет несуществующий productName или productID, вы просто сделаете красивую страницу 404.   -  person jfriend00    schedule 08.03.2017
comment
Как бы я заполнил правильные данные в шаблоне?   -  person Quesofat    schedule 08.03.2017
comment
В частности, это то, где я борюсь.   -  person Quesofat    schedule 08.03.2017
comment
Можно ли отображать все товары из одного шаблона? Или вы пытаетесь создать уникальный шаблон для каждого отдельного продукта? В вашем вопросе не хватает подробностей, чтобы мы знали, как помочь каким-либо конкретным образом.   -  person jfriend00    schedule 08.03.2017
comment
Я пытаюсь сделать это с одним шаблоном   -  person Quesofat    schedule 08.03.2017
comment
Гораздо проще с одним шаблоном. Вы понимаете, как данные попадают в шаблоны? Вы передаете кучу данных в res.render(), и механизм шаблонов использует эти данные для построения страницы из шаблона, включая ваши данные в то место, где шаблон говорит поместить данные. Таким образом, вы берете входящий продукт, указанный в URL-адресе, ищете кучу данных о нем, а затем передаете все эти данные в res.render() вместе с именем шаблона. Так работают шаблоны Express.   -  person jfriend00    schedule 08.03.2017


Ответы (1)


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

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

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

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

person jfriend00    schedule 08.03.2017
comment
Кроме того, в текущем коде вопроса уже есть почти все части; ему просто нужно переместить идентификатор из имени шаблона и вместо передачи всего списка продуктов использовать идентификатор, чтобы найти правильную запись в списке продуктов и передать только ее в шаблон. - person Logan Pickup; 08.03.2017
comment
Большой !! Но у меня есть вопрос, как мы отправили productID со стороны клиента, не могли бы вы помочь, пожалуйста !! - person Enginner S. Saad; 13.04.2020
comment
@SaadSohail - я бы посоветовал вам написать свой вопрос, полностью описать свою ситуацию и показать код, который у вас есть. - person jfriend00; 13.04.2020