Как отправить данные API с клиентской стороны на серверную [Nodejs] - PullRequest
0 голосов
/ 10 января 2020

Я должен получить данные от 2 API на стороне сервера. Мне нужно вызвать API пользователя, используя projectApi.projects[i].id в качестве параметра id для URL пользовательского API.

Я уверен, что должны быть ошибки в server.js и index.ejs.

Я пытаюсь распечатать:

  • (projectsApi.projects[i]).name
  • ((JSON.stringify(usersApi.group)).user[j]).username

Есть ли способ сделать это возможным?

Project API

URL: / projects? api_key = YOUR_API_KEY

{ 
  "total":2000,
  "projects":[ 
     { 
       "id":123,
       "user_id":435400,
       "name":"Project Name"
     },
     ...
   ]
} 

Пользовательский API

Идентификатор проекта = 123

url: / projects / 123 / group? api_key = YOUR_API_KEY

{ 
  "total":1,
  "group":[ 
           { 
             "id":1,
             "user":[
                  { 
                      "id":435400,
                      "username":"User Name"
                  }
              ]
           }
         ]
}

service. js

const rp = require("request-promise");

app.get('/users', function (req, res) {

    var id = req.params.id;
    var url_project = '/projects' + apiKey;
    var url_user = '/projects/' + id + '/group' + apiKey;

    Promise
      .all([rp({uri: url_project, json:true}), rp({uri: url_user, json:true})])
      .then(([projectsApi, usersApi]) => {
          res.render('index', {projectsApi, usersApi});
      }).catch(err => {
          console.log(err);
          res.sendStatus(500);
      });
});

index.e js

        <% for (var i = 0; i < (projectsApi.projects).length; i++) { %>
                <div><%= (projectsApi.projects[i]).name %></div>

                <% for (var j = 0; j < (JSON.stringify(usersApi.group)).user).length; j++) { %>
                    <% if ((projectsApi.projects[i]).user_id == (JSON.stringify(usersApi.group)).user[j]).id) { %>
                        <div><%= ((JSON.stringify(usersApi.group)).user[j]).username%></div>
                    <% } %>
                <% } %> 

        <% } %>

1 Ответ

0 голосов
/ 10 января 2020

Ваш service.js выглядит хорошо. Вместо использования циклов for в шаблоне ejs я просто сгенерировал бы один список (в service.js) и передал бы его в шаблон.

Promise.all([rp({uri: url_project, json:true}), rp({uri: url_user, json:true})])
      .then(([projectsApi, usersApi]) => {
          let usersList = usersApi.group.map(g => g.user);
          usersList = usersList.flat();
          const finalList = [];
          for (let i = 0; i < projectsApi.projects.length; i++) {
            const object = {};
            object.projectName = projectsApi.projects[i].name;

            for (let j = 0; j < usersList.length; j++) {
              if (projectsApi.projects[i].user_id === usersList[j].id) {
                object.userName = usersList[j].username;
              }
            }

            finalList.push(object);
          }
          res.render('index', {finalList});
      }).catch(err => {
          console.log(err);
          res.sendStatus(500);
      });

В вашем шаблоне -

<% for (var i = 0; i < finalList.length; i++) { %>
    <div><%= (finalList[i]).projectName %></div>
    <div><%= (finalList[i]).userName %></div>
<% } %>

Редактировать

Похоже, flat() здесь не будет работать, так как он еще не реализован , Вы можете сделать одну из двух вещей:

1) usersList = usersList.reduce((acc, val) => acc.concat(val), [])

2) использовать библиотеку типа lodash, которая предоставляет метод flatten()

userList = _.flatten(userList)

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