2015-04-14 14 views
9

Ich habe auch diese to the relevant issue on http-proxy veröffentlicht.Knoten hängt an POST-Anfrage bei Verwendung von http-Proxy und Body-Parser mit Express

Ich benutze http-proxy mit express, so dass ich Anfragen zwischen meinem Client und API abfangen kann, um einige Cookies für die Authentifizierung hinzuzufügen.

Zur Authentifizierung muss der Client eine POST-Anfrage mit x-www-form-urlencoded als Inhaltstyp senden. So verwende ich body-parser Middleware, um den Anfragetext zu analysieren, damit ich Daten in die Anfrage einfügen kann.

http-proxy hat ein Problem mit der Verwendung von body-parser angeblich, weil es den Körper als Stream analysiert und nie schließt, damit der Proxy niemals die Anfrage nie abschließt.

There is a solution in the http-proxy examples dass "re-streams" die Anfrage, nachdem es analysiert wurde, die ich versucht habe zu verwenden. Ich habe auch versucht, die connect-restreamer solution in the same issue ohne Glück zu verwenden.

Mein Code sieht wie folgt aus

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); 

und ich erhalte diesen Fehler

/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) 

ich versucht habe, um den Fluss zu debuggen, aber für Strohhalme ergreife. Irgendwelche Vorschläge bitte ??

+0

Nur frage mich, warum Sie einfach nicht ausdrücklich Middleware anstelle von http-Proxy? Sie können alle Anfragen mit Middleware abfangen/ändern. – jfriend00

Antwort

-1

http-Proxy ist notorisch schlecht in der Handhabung von POST-Körpern, besonders in den neuesten Versionen von Node; und Middleware-Hacks funktionieren nicht immer mit allen POST-Anfragen. Ich schlage vor, Sie verwenden eine dedizierte HTTP-Proxy-Engine wie die in NGINX oder HAPROXY, die am besten funktionieren.

2

Ich habe dieses Problem erlebt und konnte nicht zur Arbeit kommen. Hier ist die Lösung, die ich kam, wenn auch grob und möglicherweise nicht akzeptabel für Ihr Projekt.

Ich habe am Ende die body-parser Middleware auf die Route selbst verschoben und nicht route Middleware, da mein Projekt nur ein paar Routen hatte und das Reset über meine http-Proxy Middleware lief.

so statt dessen:

router.use(bodyParser.json()); 

router.get('/', function(){...}); 

router.use(httpProxy()); 

Ich tat dies:

router.get('/', bodyParser.json(), function(){...}) 

router.use(httpProxy()) 
Verwandte Themen