Могу ли я использовать запрос npm несколько раз на одном маршруте и отображать результаты на одной странице?

Есть ли способ использовать «запрос» модуля узла несколько раз в одном маршруте и отображать результаты на одной и той же отображаемой странице шаблона ejs?

Цель: я хочу отображать информацию об электронных книгах из iTunes Store, используя их API поиска. Прямо сейчас я могу получить цену электронной книги на одной территории, но я хотел бы отображать цены на одну и ту же электронную книгу в нескольких странах. Чтобы получить каждую разную цену, мне нужно использовать другой URL-адрес, либо окончание по умолчанию, «&country=gb», «&country=fr» и т. д. Я могу получить цены для каждой из 5 интересующих меня стран, но я могу не получить их все на той же странице. Как я могу построить свой маршрут и подготовить свои переменные, чтобы я мог отображать информацию из всех этих стран при отображении одной страницы?

Я использую узел, экспресс и ejs, и я делаю http-запрос, используя модуль узла «запрос». Вот основы формы, которую я использую, где я ввожу ISBN в поле searchTerm. (Есть еще, но он громоздкий.)

<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, который я передаю в request. Однако, если я попытаюсь снова вызвать запрос и сразу передать все переменные результатов в res.render, результат первого запроса не будет доступен во втором запросе («ReferenceError: iTunesResults не определен»)

Я предполагаю, что есть способ получить массив searchURL и массив результатов (req.query.searchTerm), тогда я могу передать массив или более сложный объект при отображении шаблона test.ejs. Ограничен ли одним HTTP-запросом на маршрут app.get? (Простите меня, если это должно быть очевидно, но я просто хочу получить эту информацию о ценах и отобразить ее рядом друг с другом. Кроме того, я подумал, что в моем вопросе было бы лучше быть подробным.)


person Lisa V    schedule 05.08.2014    source источник
comment
Я понимаю, что в целом должна быть возможность использовать запрос несколько раз внутри одного маршрута app.get/app.post. Теперь мне просто нужно понять, как это сделать.   -  person Lisa V    schedule 05.08.2014


Ответы (1)


Ok! Я решил это, используя библиотеку узлов "async". 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
      });
  })
});
person Lisa V    schedule 05.08.2014