如何使expressjs像facebook一样支持批量请求
我有一套不同方法的路线。 我想让expressjs支持与Facebook, Facebook Batch Request非常相似的批量请求 。 有人知道该怎么做吗? 而我不想让3回送连接处理批处理请求。
如果您不想进行回送连接,那么最简单的解决scheme是使用假请求手动调用您的服务器。
你将不得不重新实现IncomingMessage 。 你也应该使用Async#map来等待所有的请求被处理。
这是基本的想法:
//您可能需要做更多的工作来重新实现http基本API。 函数FakeRequest(request){ this.url ='/'+ request.relative_url; this.method = request.method; this.headers = request.headers; } 函数FakeResponse(){ Stream.call(本); this.statusCode = null; this.body =''; } FakeResponse.prototype.write = function(chunk){ this.body + = chunk.toString('utf8'); 返回true; }; util.inherits(FakeResponse,Stream); app.post('/',function(req,res){ var requests = JSON.parse(req.body.batch); async.map(requests,function(request,done){ var fakeReq = new FakeRequest(request), fakeRes = new FakeResponse(); //手动调用Express“中间件 应用程序(fakeReq,fakeRes); //当响应准备就绪时会触发。 fakeRes.once('end',function(){ //不要泄漏听众 fakeRes.removeAllListeners(); 完成(null,fakeRes); }); fakeRes.once('error',function(err){ fakeRes.removeAllListeners(); DONE(ERR); }); },函数(err,responses){ 如果(err) 返回res.send(err); res.send(响应); }); }); http.createServer(app).listen(app.get('port'),function(){ console.log('Express server listen on port'+ app.get('port')); });
UPDATE
实际上我不确定你的回环是什么意思,但是你有两个select:
-
为批处理中的每个请求打开一个HTTP连接,这比较容易实现,但速度较慢。
-
上面概述的解决scheme:直接调用Express中间件而不打开HTTP请求。
我的印象是,你不想要第一个解决scheme。 不过,那就是我会先试一下,即使速度较慢:
- 在缩放时,更容易将批量连接分散到多个实例中。
- 您不会绕过您可能具有的任何负载调节机制(这会阻止单个Express实例同时处理太多的请求)。
一定要禁用HTTP代理 。
- 对象函数路由器(req,res,next){router.handle(req,res,next); }没有办法
- 从服务器端获取客户端的variables(express.js,node.js)
- npm start命令不起作用,并显示mongoose的弃用函数错误
- 传递数据在ExpressJS + Reactjs中查看
- 从JSON创build一个mongoose模式
- Node.js Express护照Cookie过期
- 如何在Express中强制parsing请求主体而不是json?
- 在express.js中使用sequelize更改数据库连接,具体取决于路由
- 如何使用dynamic助手重写express.js中的Flash消息?