Как создать одно представление EJS для возврата результатов от нескольких конечных точек Node API? - PullRequest
0 голосов
/ 05 декабря 2018

Я использую довольно простое приложение Mongo Node Express для обслуживания сайта.

В настоящее время, когда пользователь входит в систему, ему предоставляется его панель управления.Экспресс-приложение направляется на контроллер, чтобы показать пользователя и получает всю информацию о пользователе.Панель инструментов - это EJS-представление со всей логикой для отображения каждого бита информации.

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

Для произвольного примера, давайте предположим, что пользователь имеет вещи , которые имеют стили , а пользователь имеет оборудование , которое имеет поставщиков .Пользователь, вещь, поставщик, оборудование и поставщик - все это схемы Мангуста.Таким образом, когда мы отображаем пользовательский сайт, мы запрашиваем у mongodb и заполняем его вещи и вещи. Стили, а также их экипировку и оборудование. Поставщики (предположим, что мы уже используем любую логику, необходимую для ограничения возвращаемого значения).информация о том, что актуально для пользователя).

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

Я придумал это, и он делает только такие простые вещи, как группировка результатов и изменение классов для div, но я думаю, что это показывает идею дифференциации.

fakeuser.ejs

<% include ../partials/header %>
    <div class="container-fluid">
        <div id="things">
          <h2>Things by Style</h2>
          <% const splitthings = user.things.reduce(function(acc, item) {
            var key = item.style.design; // arbitrarily groupby thing.style.design
            acc[key] = acc[key] || [];
            acc[key].push(item);
            return acc;
          }, {});

          for (var key in splitthings) {
            if (splitthings.hasOwnProperty(key)) {
                splitthings[key].sort(function(a,b){
                  return a.count-b.count;  // sort by thing.count
                }); %>
            <div> 
              <h4><%= key %></h4>
              <% splitthings[key].forEach(function(thing){ %>
                <p>blah blah <%= thing.title %> blah blah <%= thing.count %> blah blah </p>
              <% } %>
            </div>
          <% }} %>
        </div>
        <div id="equipment">
            <h2>Equipment</h2>
            <% const splitequipment = user.equipment.reduce(function(acc, item) {
              var key = item.supplier.name; // arbitrarily groupby equpiment.suppplier.name
              acc[key] = acc[key] || [];
              acc[key].push(item);
              return acc;
            }, {});

            for (var key in splitequipment) {
                let size = key=="Some Special" : 'large' ? 'small';
              if (splitequipment.hasOwnProperty(key)) {
                  splitequipment[key].sort(function(a,b){
                    return a.count-b.count;  // sort by equipment.count
                  }); %>
              <div> 
                <h4 class="<%= size %>"><%= key %></h4>
                <% splitequipment[key].forEach(function(eq){
                    let bg = "primary"
                    switch (eq.someproperty) {
                      case 'ege':
                        bg = "secondary";
                        break;
                      case 'aar':
                      case 'xyz':
                      case 'eee':
                        bg = "success"
                        break;
                      case 'zzz':
                        bg = "warning"
                        break;
                      default:
                        bg = "light"
                    } 

                 %>
                  <div class="bg-<%=bg %>">
                  <p>blah blah <%= eq.title %> blah blah <%= eq.something %> blah blah </p>
                  </div>
                <% } %>
              </div>
          <% }} %>
        </div>
        <div id="user">
            <h2>User Info</h2>
            <div>
              <h4><%= user.name %></h4>
              <p><%= user.arbitraryinfo %></p>
            </div>
        </div>
    </div>
    <% include ./partials/footer %>

Мой вопрос по существу: Можем ли мы вместо этого делать простые вызовы API для получения данных для каждого контейнера? Как, например, мы можем заполнить контейнер Equipment из вызова, чтобы сказать /api/user/:userid/equipmentpartial (при условии, что мы установили эту конечную точку для возврата действительного HTML).И следуйте этому: Хотели бы мы это сделать? Кажется, что было бы замечательно, если бы мы хотели вернуть материал, который находится в отдельном API или явно не связан с пользователем, куда он мог бы быть возвращенкак часть объекта пользователя;однако, это может быть ненужным или плохим также.Я просто не знаю.

Если бы мы хотели показать все оборудование (не только оборудование пользователя) на этой странице, я не уверен, как бы я это сделал ... за исключением того, чтобы получить все оборудование издругой сервис в API, а затем передать его на вид.Что если бы мы хотели, скорее всего, показать рекомендуемое оборудование или рекомендуемое поставщики ?Я предполагаю, что нам нужен контейнер, который в основном говорит: «Привет, есть ли какие-либо функции x? Если это так, я полностью их покажу»

Я могу и смогу включить эти данные, когда добавлюих объекту при рендеринге fakeuser.ejs из контроллера.

otherfakeuser.ejs

    <% include ./partials/header %>
    <div>
        <div id="thing">
            same
        </div>
       <div id="user">
            same
        </div>
        <div id="featured">
            <% featured.forEach(function(feat) { 
                // I can include featured as a separate array
                // object that is passed to fakeuser.ejs %> 
               <h2><%= feat.name %></h2>
            <% } %>
        </div>
    <div>
    <% include ./partials/footer %>

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

Поэтому я спрашиваю, как мы можем заполнить частичное из отдельной конечной точки API.

otherfakeuser.ejs

    <% include ./partials/header %>
    <div>
        <div id="thing">
            same
        </div>
       <div id="user">
            same
        </div>
        <div id="featured">
            <% somehow load /api/featured/equipment %>
        </div>
    <div>
    <% include ./partials/footer %>

Я попытался выяснить это, но я бью стену.Если я добавляю конечную точку к контейнеру и на странице загружаю js, страница перезагружается только до новой конечной точки (которая обычно недопустима, потому что это означает быть частью веб-страницы, а не целой).И, что более важно, никакие мои тесты и выполнение этой работы не ответят на вопрос о , должно ли это быть сделано .

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