使用http-proxy和body-parser与express时,节点挂起POST请求

我也已经把这个发布到http-proxy的相关问题上 。

我正在使用http-proxyexpress所以我可以截取我的客户端和api之间的请求,以添加一些cookie进行身份validation。

为了validation客户端必须发送带有x-www-form-urlencoded作为内容types的POST请求。 所以我使用body-parser中间件来parsing请求体,这样我就可以在请求中插入数据了。

http-proxy在使用body-parser遇到了一个问题,因为它将bodyparsing为一个stream,并且从不closures它,所以proxy永远不会完成请求。

在http-proxy的例子中有一个解决scheme,在我尝试使用的parsing之后,“重新stream”请求。 我也试图在同样的问题中使用connect-restreamer解决scheme,但没有运气。

我的代码看起来像这样

 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) 

我试图debuggingstream量,但我正在抓吸pipe。 请提出任何build议?

       

网上收集的解决方案 "使用http-proxy和body-parser与express时,节点挂起POST请求"

我遇到了这个问题,我无法得到正确的工作。 我的解决scheme虽然简单,但可能不适合您的项目。

我最终将body-parser中间件移动到了路由本身,而不是路由中间件,因为我的项目只有一些路由,重置过了我的http代理中间件。

所以不是这样的:

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

我做到了这一点:

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

http-proxy在处理POST正文时尤其糟糕,特别是在最新版本的Node中; 而中间件攻击并不总是适用于所有的POST请求。 我build议你使用像NGINX或HAPROXY那样的专用http代理引擎,那些工作最好。