2016-12-09 4 views
0

У меня есть приложение Express.JS, которое делает прокси-вызов для маршрута с использованием модуля узла запроса. Это хорошо работает с NodeJS V0.10.28; однако обновление до NodeJS V4.4.7 привело к сбою - сброс ошибки «Ошибка: запись после завершения».Node.JS proxy с использованием модуля запросов

Я новичок в NodeJS; поэтому я ценю вашу помощь.

var bodyParser=require('body-Parser'); 
app.use(bodyParser.json({limit: '100mb'})); 
app.use(bodyParser.urlencoded({extended: false})); 

.... 
.... 

app.use('/relay', function (req, res) { 
     var request = require('request'), 
      proxyUrl = 'http://abc.proxy.xyz:12345', 
      apiEndPoint = "https://aaa.bbb.ccc/svc"; 

     req.pipe(request.post(apiEndPoint,{ proxy: proxyUrl, form: req.body}, function (error, response, body) { 

      if (error) { 
       console.log(error) 
      } else { 
       console.log("No error here.") 
      } 

      res.end(); 

     })).pipe(res); 
}); 

ответ

0

Для потомков, вот мое решение, в случае, если кто-то другой столкнулся с той же проблемой.

Проблема заключалась в использовании агента-парсера промежуточного слоя: body-parser считывает запрос до завершения - и, следовательно, поток достиг своего конца. Следовательно, req.pipe() - в/релейный маршрут, показанный в вопросе, - не имеет ничего для чтения, и он не будет перезапускать поток.

Возвращенное сообщение об ошибке «write after end» является довольно неоднозначным. Также загадка, почему я не столкнулся с этой проблемой с Node.JS V0.10.28. Сообщил, что проблема была замечена в V4.4.7

Таким образом, чтобы обойти эту проблему тела синтаксического анализатора, я переместил/релейный маршрут к выше звонков тела-парсера:

app.use('/relay', function (req, res) { 
     var request = require('request'), 
      proxyUrl = 'http://abc.proxy.xyz:12345', 
      apiEndPoint = "https://aaa.bbb.ccc/svc"; 

     req.pipe(request.post(apiEndPoint,{ proxy: proxyUrl, form: req.body}, function (error, response, body) { 

      if (error) { 
       console.log(error) 
      } else { 
       console.log("No error here.") 
      } 

      res.end(); 

     })).pipe(res); 
}); 

.... 
.... 

var bodyParser=require('body-Parser'); 
app.use(bodyParser.json({limit: '100mb'})); 
app.use(bodyParser.urlencoded({extended: false})); 
Смежные вопросы