如何将API数据从客户端发送到服务器端[Nodejs]

时间:2020-01-10 09:45:44

标签: node.js rest api express

我应该从服务器端的2个API获取数据。我需要使用projectApi.projects[i].id作为User API Url的id参数来调用User API。

我确定server.jsindex.ejs中肯定有错误。

我正在尝试打印:

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

有什么办法可以实现?

项目API

URL: / projects?api_key = YOUR_API_KEY

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

用户API

项目ID = 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.ejs

        <% 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 :(得分:0)

您的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)