2015-03-12 6 views
0

Итак, в настоящее время я создаю небольшое личное приложение для обучения, у меня есть сценарий, в котором я должен был использовать API других третьих лиц, но несколько для одного объекта. Например, у меня есть 1 панель инструментов для рендеринга, и я хочу сделать разные вызовы в разных местах, а продукт - объектом данных назад, который содержит три запроса ответа.NodeJS, Express и маршрутизация с внешними запросами

Например, на данный момент у меня есть что-то (похожее) ниже, которое делает запрос и возвращает эти данные вместе с другими данными из метода поиска и текущего сеанса пользователя. Прекрасно работает.

app.get('/profile', isLoggedIn, function(req, res) { 
    Object.find().exec(function (err, records) { 
     request('firstUrl', function(err, resp, body) { 
      res.render('profile.ejs', { 
       user : req.user, 
       records : records, 
       responseData : JSON.parse(body) 
      }); 
     }); 
    }); 
}); 

Но теперь я хочу сделать более одного запроса ... так что я не уверен, как это сделать, а также передовой опыт?

Ниже чувствует, что это не будет работать, и неаккуратно:

app.get('/profile', isLoggedIn, function(req, res) { 
    Object.find().exec(function (err, records) { 
     request('firstUrl', function(err, resp, body1) { 
      request('secondUrl', function(err, resp, body2) { 
       request('thirdUrl', function(err, resp, body3) { 
        res.render('profile.ejs', { 
         user : req.user, 
         records : records, 
         responseData1 : JSON.parse(body1), 
         responseData2 : JSON.parse(body2), 
         responseData3 : JSON.parse(body3) 
        }); 
       });    
      }); 
     }); 
    }); 
}); 

Может кто-нибудь пролить немного света на этот счет?

ответ

1

Возможно, вы найдете async.js, чтобы ваш код был чистым от «обратного ад». В частности, методы parallel или series.

Например (не проверено):

async = require('async'); 

app.get('/profile', isLoggedIn, function(req, res) { 
    async.parallel({ 
     records: function(callback) { 
      Object.find().exec(function (err, records) { 
       callback(null, records); 
      }); 
     }, 
     responseData1: function(callback) { 
      request('firstUrl', function(err, resp, body) { 
       callback(null, JSON.parse(body)); 
      }); 
     }, 
     responseData2: function(callback) { 
      request('firstUrl', function(err, resp, body) { 
       callback(null, JSON.parse(body)); 
      }); 
     }, 
     responseData3: function(callback) { 
      request('firstUrl', function(err, resp, body) { 
       callback(null, JSON.parse(body)); 
      }); 
     }, 
    }, 
    function(err, results) { 
     res.render('profile.ejs', { 
      user : req.user, 
      records : results.records, 
      responseData1 : results.responseData1, 
      responseData2 : results.responseData2, 
      responseData3 : results.responseData3 
     }); 
    }); 
}); 

Параллельный метод может также принимать множество функций вместо объекта, который также может быть полезным для вас. Посмотрите at the documentation.

Если вы планируете иметь переменное количество URL-адресов, которые вы получаете с запросом, может быть целесообразным реорганизовать код, чтобы использовать очереди или методы обработки async.js вместо повторения одного и того же кода для каждого URL-адреса, который вы хотите загружать.

+0

Это отличный ответ, спасибо. Я пробовал вложенные операторы, и это действительно работает, но я собираюсь идти вперед и внедрять асинхронный процесс теперь, это намного лучше/более аккуратный способ сделать это и разоблачить объекты вместе. Еще раз спасибо! – Jamie

+0

Работает отлично - еще раз спасибо! – Jamie

+0

Рад это слышать! JavaScript Promises - это еще один способ сделать это, но в этом случае async.js, возможно, проще или лучше известно. –