繁体   English   中英

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

[英]Can I use npm request multiple times in one route and have the results display on the same page?

有没有一种方法可以在一条路由中多次使用节点模块“请求”,并使结果显示在同一渲染的ejs模板页面上?

目标:我想使用他们的Search API显示来自iTunes Store的电子书信息。 现在,我可以在一个地区获得电子书的价格,但我想显示多个国家/地区的同一本电子书的价格。 要获得每个不同的价格,我需要使用不同的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
    });
    }
  });
});

我想要做的是向苹果发出额外的请求,在这里使用相同的搜索词,但在我传递给请求的searchURL的末尾添加国家/地区标识符。 但是,如果我尝试再次调用请求并将所有结果变量一次传递到res.render中,则第一个请求的结果将在第二个请求中不可用。(“ ReferenceError:未定义iTunesResults”)

我猜想有一种方法可以拥有一个searchURL数组和一个结果数组(req.query.searchTerm),然后在渲染test.ejs模板时可以传递该数组或更复杂的对象。 每个app.get路由限于一个http请求吗? (请原谅我,如果这应该很明显,但我只想获取此定价信息,并将其彼此相邻显示。另外,我认为在我的问题中进行详细说明会更好。)

好! 我使用“异步”节点库解决了该问题。 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
      });
  })
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM