Javascript 如何将多个API调用响应传递给前端和循环
我不熟悉javascript,试图在网上找到答案,但还是停留在这里 尝试使用GooglePlacesAPI通过“Promise”函数获取多个位置的数据,然后只提取所有位置的“reviews”部分。 将结果渲染到前端后,我得到: [对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象对象],[对象对象对象对象] 如果我使用console.log(results),我可以在终端中看到结果,但在前端只能得到多个[object] app.js文件:Javascript 如何将多个API调用响应传递给前端和循环,javascript,arrays,node.js,api,promise,Javascript,Arrays,Node.js,Api,Promise,我不熟悉javascript,试图在网上找到答案,但还是停留在这里 尝试使用GooglePlacesAPI通过“Promise”函数获取多个位置的数据,然后只提取所有位置的“reviews”部分。 将结果渲染到前端后,我得到: [对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象对象],[对象对象对象对象] 如果我使用console.log(result
var express = require("express");
var app = express();
var request = require("request");
var bodyParser = require("body-parser");
//APP CONFIG
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(bodyParser.urlencoded({extended: true}));
// fakes request
function request(url, cb) {
setTimeout(() => cb(null, 200, `{"Search": "success for ${url}" }`), 200)
}
let locations = ['ChIJd5X4zalZwokR8HwFrpqhZTM', 'ChIJUQgmLP5YwokRaXhfzBfk0wY', 'ChIJ34UGSqNZwokR8PYj2UiNZ2k']
// promisesArray will hold all the promises created in map()
app.get("/resultspage", function(req, res){
let promisesArray = locations.map(location => {
// make a new promise for each element of cities
return new Promise((resolve, reject) => {
let url = 'https://maps.googleapis.com/maps/api/place/details/json?key=APIKEYHERE&placeid=' + location
request(url, function(error, response, body) {
if (error) {
reject(error);
}
var data = JSON.parse(body)
var results = data.result.reviews;
// resolve once we have some data
resolve(results);
});
})
})
Promise.all(promisesArray)
.then(function(results) {
console.log(results)
res.render("resultspage", {data: results});
})
.catch(function(error) {
console.log(error)
})
})
app.listen(process.env.PORT, process.env.IP, function(){
console.log("app has started!!");
});
resultspage.ejs文件
<h1>Results Page</h1>
<%= data %>
结果页面
以下是指向Google Place详细信息网页的链接:
谢谢 排队
<%= data %>
EJS希望两个括号之间有一个字符串。您传递给它的是一个对象数组,它被字符串化以生成您所看到的内容。相反,您可以尝试将其解包,直到将所需字段放入一个巨大的字符串中:
<%= data.map(review => review.author_name).join(',') %>
review.author_name).join(',')%>
(或者,当然,您可以使my map and join函数更复杂,以添加HTML标记和样式。)您可以直接使用,而不是将回调转换为承诺
var rp = require('request-promise');
app.get("/resultspage", function (req, res) {
Promise.all(locations.map(location => rp('https://maps.googleapis.com/maps/api/place/details/json?key=APIKEYHERE&placeid=' + location)))
.then(function (results) {
results = results.map(result => {
var data = JSON.parse(body)
return data.result.reviews;
});
console.log(results)
res.render("resultspage", {
data: JSON.stringify(results)
});
})
.catch(function (error) {
console.log(error)
})
})
我认为您只需要在前端使用JSON.stringify“重新打包”即可。谢谢。如果我使用JSON,我会得到混乱的文本,如下面的链接:谢谢。如果我使用,我会得到混乱的文本,如下面的链接:所以它基本上是一个数组,里面有3个数组,每个数组有5个对象。如果我只需要从3个位置的每个评论中提取作者姓名(总共15个作者姓名),我应该在前端使用什么代码?谢谢你,我仔细考虑了你的建议,我想我应该能够找到答案。使用以下代码: