2015-11-30 5 views
3

Итак, я создаю REST API, используя узел, и мне нужно создать маршрут. Назначение маршрута: действовать как прокси-сервер и совершать вызовы на другой внешний веб-сайт и возвращать ответ, который он получает по первому запросу. До сих пор, у меня есть следующий код и он работает:При создании REST API в узле, как я могу передать HTTP-ответ от запроса, сделанного на внешний веб-сайт, на исходный вызов api?

app.post('/v1/something/:_id/proxy', 
    function(req, res, next) { 
     // Basically make a request call to some external website and return 
     // the response I get from that as my own response 
     var opts = {/*json containing proper uri, mehtod and json*/} 
     request(opts, function (error, responseNS, b) { 
      if(error) return callback(error) 
      if(!responseNS) return callback(new Error('!response')) 

      return res.json(responseNS.body) 
     }) 
    } 
) 

Мой вопрос, как я могу транслировать этот HTTP ответ, который я получаю от внешнего веб-сайта. Под этим я подразумеваю, что хочу получить ответ как поток и продолжать возвращать его, как только он приходит в куски. Возможно ли это?

+0

Вы хотите сказать, что хотите вернуть кусок, как только он был получен от запроса на внешний сайт? –

+1

Вы не должны использовать флаг json в параметрах, если хотите его пропустить, поскольку в этом случае вы не должны заботиться о содержимом. Этот флаг неявно активирует десериализацию JSON, которая потребует полного буфера ответа для десериализации. – jishi

+0

@LazarevAlexandr: Да. –

ответ

2

Можно передать входящий ответ от внешнего источника прямо в ответ, что ваше приложение отправляет в браузер, как это:

app.post('/v1/something/:_id/proxy', 
function(req, res, next) { 
    // Basically make a request call to some external website and return 
    // the response I get from that as my own response 
    var opts = {/*json containing proper uri, mehtod and json*/} 
    request(opts, function (error, responseNS, b) { 
     if(error) return callback(error) 
     if(!responseNS) return callback(new Error('!response')) 

     return res.json(responseNS.body) 
    }).pipe(res); 
}); 
+0

Только один вопрос: «труба» решает задачу отправки кусков ответа, как только мы его получим? –

1

С желанию вы можете непосредственно трубу входящего ответ либо файл поток, в другие запросы или ответ, который ваш api отправляет в браузер. Как

function (req, res, next) { 
    request 
     .get('http://example.com/doodle.png') 
     .pipe(res)  
} 

Similary в вашем случае только труба для ответа.

app.post('/v1/something/:_id/proxy', 
    function(req, res, next) { 
     // Basically make a request call to some external website and return 
     // the response I get from that as my own response 
     var opts = {/*json containing proper uri, mehtod and json*/} 
     request(opts, function (error, responseNS, b) { 
      if(error) return callback(error) 
      if(!responseNS) return callback(new Error('!response')) 
     }).pipe(res); 
    } 
)