我可以在一条路线中多次使用npm请求并将结果显示在同一页面上吗?

时间:2014-08-05 05:57:27

标签: javascript node.js express request ejs

有没有办法在一条路线中多次使用节点模块“请求”并将结果显示在同一个渲染的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请求? (请原谅我,如果这应该是显而易见的,但我只是想抓住这个定价信息并将它显示在彼此旁边。而且,我认为在我的问题中更加冗长会更好。)

1 个答案:

答案 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
      });
  })
});