【问题标题】:How to send API data from client-side to server-side [Nodejs]如何将 API 数据从客户端发送到服务器端 [Nodejs]
【发布时间】:2020-01-10 09:45:44
【问题描述】:

我应该从服务器端的 2 个 API 获取数据。我需要使用 projectApi.projects[i].id 作为用户 API 网址的 id 参数来调用用户 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"
     },
     ...
   ]
} 

用户 API

项目 ID = 123

网址:/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>
                    <% } %>
                <% } %> 

        <% } %>

【问题讨论】:

  • 请分享收藏?

标签: node.js rest api express


【解决方案1】:

您的service.js 看起来不错。我不会在ejs 模板中使用for 循环,而是简单地生成一个列表(在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) =&gt; acc.concat(val), [])

2) 使用像lodash 这样的库,它提供了flatten() 方法

userList = _.flatten(userList)

【讨论】:

  • 感谢您的回答!但问题是我必须知道 ejs(客户端)中的 projectApi.projects[i].id 并将其用作服务器端(/project/id/team)的用户 API 中 id 的参数,并在ejs 客户端。这必须在Promise 呈现网址之前定义。 var url_project = '/projects' + apiKey; var url_user = '/projects/' + projectApi.projects[i].id + '/group' + apiKey;
  • @HyewonJoo 在这种情况下,只需将项目 ID 添加到 objectobject.projectId = projectsApi.projects[i].id;
猜你喜欢
  • 2020-08-17
  • 2022-01-12
  • 2015-03-05
  • 2019-03-05
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多