Я также разместил это to the relevant issue on http-proxy
.Узел зависает при запросе POST при использовании http-proxy и body-parser с выражением
Я использую http-proxy
с express
, поэтому я могу перехватывать запросы между моим клиентом и api, чтобы добавить некоторые файлы cookie для аутентификации.
Для аутентификации клиент должен отправить запрос POST с x-www-form-urlencoded
в качестве типа содержимого. Поэтому я использую связующее ПО body-parser
, чтобы проанализировать тело запроса, чтобы я мог вставлять данные в запрос.
http-proxy
есть проблема с использованием body-parser
, предположительно потому, что он анализирует тело как поток и никогда не закрывает его, поэтому прокси никогда не завершает запрос.
There is a solution in the http-proxy examples, который «повторно передает» запрос после его обработки, который я пытался использовать. Я также пытался использовать connect-restreamer
solution in the same issue без везения.
Мой код выглядит следующим образом
var express = require('express'),
bodyParser = require('body-parser'),
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({changeOrigin: true});
var restreamer = function(){
return function (req, res, next) { //restreame
req.removeAllListeners('data')
req.removeAllListeners('end')
next()
process.nextTick(function() {
if(req.body) {
req.emit('data', req.body) //error gets thrown here
}
req.emit('end')
})
}
}
var app = express();
app.use(bodyParser.urlencoded({extended: false, type: 'application/x-www-form-urlencoded'}));
app.use(restreamer());
app.all("/api/*", function(req, res) {
//modifying req.body here
//
proxy.web(req, res, { target: 'http://urlToServer'});
});
app.listen(8080);
и я получаю эту ошибку
/Code/project/node_modules/http-proxy/lib/http-proxy/index.js:119
throw err;
^
Error: write after end
at ClientRequest.OutgoingMessage.write (_http_outgoing.js:413:15)
at IncomingMessage.ondata (_stream_readable.js:540:20)
at IncomingMessage.emit (events.js:107:17)
at /Code/project/lib/server.js:46:25
at process._tickCallback (node.js:355:11)
Я пытался отладить поток, но я схватив за соломинку. Любые предложения, пожалуйста?
Просто интересно, почему вы не просто использовать экспресс-промежуточное программное обеспечение вместо HTTP-прокси? Вы можете перехватывать/изменять все запросы с помощью промежуточного программного обеспечения. – jfriend00