繁体   English   中英

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

[英]How to send API data from client-side to server-side [Nodejs]

我应该从服务器端的 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

网址: /projects?api_key=YOUR_API_KEY

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

用户接口

项目 ID = 123

网址:/projects/ 123 /group?api_key=YOUR_API_KEY

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

服务.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);
      });
});

索引.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>
                    <% } %>
                <% } %> 

        <% } %>

您的service.js看起来不错。 我不会在ejs模板中使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM