有没有办法在一条路线中多次使用节点模块“请求”并将结果显示在同一个渲染的ejs模板页面上?
目标:我想使用他们的搜索API在iTunes商店中显示电子书信息。现在我可以在一个地区获得电子书的价格,但我想在多个国家/地区显示同一电子书的价格。为了得到每个不同的价格,我需要使用不同的URL,默认结尾,“& country = gb”,“& country = fr”等。我可以获得我感兴趣的5个国家/地区中的每个国家/地区的价格,但我无法将它们全部放在同一页面上。如何构建我的路线并准备我的变量,以便在渲染一页时可以显示所有这些国家/地区的信息?
我正在使用node,express和ejs,我正在使用“请求”节点模块发出http请求。以下是我正在使用的表单的基础知识,我在searchTerm字段中输入ISBN。 (还有更多,但它很笨重。)
<form action="/search">
<select name="searchTerm">
现在正在使用的代码,用于在一个地区获取有关该书的信息:
app.get('/search', function(req, res){
var searchRequest = req.query.searchTerm;
var searchURL = "http://itunes.apple.com/lookup?isbn=" + searchRequest;
request(searchURL, function(error, response, body){
if (!error && response.statusCode == 200) {
var data = JSON.parse(body);
console.log(data.results[0]);
var iTunesResults = data.results[0];
res.render("test", {
iTunesResults: iTunesResults,
searchRequest: searchRequest
});
}
});
});
如果我在此代码中进行一些更改,我可以在不同的国家/地区获取有关同一电子书的信息,只需进行一些更改。下面是英国的代码,它可以自行运行,我只是希望立即显示这两个搜索的结果,我不知道从哪里开始。
app.get('/search', function(req, res){
var searchRequest = req.query.searchTerm;
var gbSearchURL = "http://itunes.apple.com/lookup?isbn=" + searchRequest + "&country=gb";
request(gbSearchURL, function(error, response, body){
if (!error && response.statusCode == 200) {
var data = JSON.parse(body);
console.log(data.results[0]);
var iTunesResults = data.results[0];
res.render("test", {
iTunesResults: iTunesResults,
searchRequest: searchRequest
});
}
});
});
我想要做的是向Apple提出额外请求,使用相同的搜索词,但在我传递给请求的searchURL末尾添加国家/地区标识符。但是,如果我尝试再次调用请求并立即将所有结果变量传递给res.render,则第一个请求的结果将不会在第二个请求中可用。(“ReferenceError:未定义iTunesResults”)
我猜有一种方法可以获得一个searchURL数组和一个结果数组(req.query.searchTerm),然后我可以在渲染test.ejs模板时传递数组或更复杂的对象。限制为每个app.get路由一个http请求? (请原谅我,如果这应该是显而易见的,但我只是想抓住这个定价信息并将它显示在彼此旁边。而且,我认为在我的问题中更加冗长会更好。)
答案 0 :(得分:2)
确定!我使用&#34; async&#34;解决了问题。节点库。 http://www.github.com/caolan/async
有了这个,我可以并行调用多个函数,当它们完成后,我可以将结果传回模板进行渲染。
app.get('/search', function(req, res){
async.parallel([
function(done){
var searchRequest = req.query.searchTerm;
var gbSearchURL = "http://itunes.apple.com/lookup?isbn=" + searchRequest + "&country=us";
request(gbSearchURL, function(error, response, body){
if (!error && response.statusCode == 200) {
// console.log(body)
var data = JSON.parse(body);
// below shows whole object of result 0
console.log(data.results[0]);
done(null, data.results[0]);
}
});
},
// UK pricing
function(done){
var searchRequest = req.query.searchTerm;
var gbSearchURL = "http://itunes.apple.com/lookup?isbn=" + searchRequest + "&country=gb";
request(gbSearchURL, function(error, response, body){
if (!error && response.statusCode == 200) {
// console.log(body)
var data = JSON.parse(body);
// below shows whole object of result 0
console.log(data.results[0]);
done(null, data.results[0]);
}
});
},function(err, iTunesResults){
res.render("test", {
iTunesResults: iTunesResults,
searchRequest: req.query.searchTerm
});
})
});