使用http-proxy和body-parser与express时,节点挂起POST请求
我也已经把这个发布到http-proxy
的相关问题上 。
我正在使用http-proxy
与express
所以我可以截取我的客户端和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议?
我遇到了这个问题,我无法得到正确的工作。 我的解决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代理引擎,那些工作最好。
- 找不到package.json:/
- 在LoopbackJS中:如何在启动脚本或服务器端代码中获取服务器协议(http或https)?
- Express,玉石布局文件渲染体而不是渲染头
- 使用Jade's:markdownfilter时是否可以包含外部文件?
- 在ExpressJS中接受CORS请求的自定义HttpHeaders
- Express.js中的EJS – Express Helpers无法正常工作 – (app)处于require状态
- Express没有方法configuration错误
- Socket.io不会触发客户端到服务器的事件
- 这个怎么用? 在Express中使用可选的第一个参数(err,req,res,next)或者(req,res,next)