我应该从服务器端的2个API获取数据。我需要使用projectApi.projects[i].id
作为User API Url的id参数来调用User API。
我确定server.js
和index.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>
<% } %>
<% } %>
<% } %>
答案 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)