2016-11-27 5 views
0

У меня есть NodeJS API. Логика в API должна сделать HTTP-запрос на google.com, захватить ответ с google.com, а затем вернуть html-ответ на исходный вызов API. Моя проблема заключается в том, чтобы отследить HTTP-ответ от асинхронного альянса Google и вернуть его в исходный вызов API.NodeJS API делает вложенный запрос HTTP get и возвращает ответ

// Entry point to /api/specialday 
module.exports = function(apiReq, apiRes, apiNext) { 
    var options = { 
    host: 'www.google.com' 
    }; 

    callback = function(googleRes) { 
    var str = ''; 

    // another chunk of data has been recieved, so append it to `str` 
    googleRes.on('data', function (chunk) { 
     str += chunk; 
    }); 

    // capture the google response and relay it to the original api call. 
    googleRes.on('end', function() {   
     apiRes.send(str); 
    }); 
    } 

    http.request(options, callback).end(); 
} 

Ошибка, которую я получаю здесь: Uncaught TypeError: Cannot read property 'send' of undefined. Я понимаю, почему я получаю сообщение об ошибке (потому что apiRes выходит за рамки), я просто не могу понять, как это сделать правильно. Любая помощь очень ценится!

ответ

0

Причина, по которой вы видите вышеуказанную ошибку, состоит в том, что исходный объект ответа apiRes не был получен к моменту получения ответа от API Google.

Насколько я могу сказать вам придется bind()apiRes дважды (непроверенные):

callback = function(googleRes) { 
    var str = ''; 

    // another chunk of data has been recieved, so append it to `str` 
    googleRes.on('data', function (chunk) { 
    str += chunk; 
    }); 

    // capture the google response and relay it to the original api call. 
    googleRes.on('end', function() {   
    apiRes.send(str); 
    }.bind(apiRes)); 

}.bind(apiRes) 

Более современное решение было бы использовать обещания для выполнения этой задачи https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

0

Обещания, это все ! Спасибо, Михал. Ниже приведен упрощенный вариант моей реализации.

// Entry point to /api/specialday 
module.exports = function(apiReq, apiRes, apiNext) { 

    var p1 = new Promise(
    // The resolver function is called with the ability to resolve or 
    // reject the promise 
    function(resolve, reject) { 

     var options = { 
     host: 'www.google.com' 
     }; 

     callback = function(googleRes) { 
     var str = ''; 

     // another chunk of data has been recieved, so append it to `str` 
     googleRes.on('data', function (chunk) { 
      str += chunk; 
     }); 

     // capture the google response and relay it to the original api call. 
     googleRes.on('end', function() {   
      resolve(str); 
     }); 
     } 

     http.request(options, callback).end(); 
)}; 

    p1.then(function(googleHtml) { 
    apiRes.status(200).send(googleHtml); 
    } 
} 

Тогда я могу запустить мое приложение и вызвать API с помощью почтальона в http://localhost:8080/api/gains:

0

Непосредственно выход трубы с apiRes, образец с использованием запроса:

var request = require("request"); 

// Entry point to /api/specialday 
module.exports = function(apiReq, apiRes, apiNext) { 
    request.get('http://www.google.fr').pipe(apiRes); 
});