【问题标题】:How to make expressjs support batch request like facebook如何使expressjs支持像facebook这样的批处理请求
【发布时间】:2013-07-30 08:45:34
【问题描述】:

我有一组不同方法的路线。我想让 expressjs 支持与 facebook Facebook Batch Request 非常相似的批处理请求。有人知道怎么做吗?而且我不想建立 3 个环回连接来处理批处理请求。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    如果您不想进行环回连接,那么最简单的解决方案是使用虚假请求手动调用您的服务器。

    您必须重新实现IncomingMessage。您还应该使用Async#map 等待所有请求都处理完毕。

    这是基本的想法:

    // 您可能需要做更多工作来重新实现 http 基本 API。 功能假请求(请求){ this.url = '/' + request.relative_url; this.method = request.method; this.headers = request.headers; } 功能假响应(){ Stream.call(this); this.statusCode = null; this.body = ''; } FakeResponse.prototype.write = 函数(块){ this.body += chunk.toString('utf8'); 返回真; }; 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(); 完成(空,fakeRes); }); fakeRes.once('error', function (err) { fakeRes.removeAllListeners(); 完成(错误); }); },函数(错误,响应){ 如果(错误) 返回 res.send(err); res.send(响应); }); }); http.createServer(app).listen(app.get('port'), function(){ console.log('Express 服务器监听端口' + app.get('port')); });

    更新

    我实际上不确定您所说的环回是什么意思,但您有两个选择:

    • 为批处理中的每个请求打开一个 HTTP 连接,这更容易实现但速度较慢。

    • 我上面概述的解决方案:直接调用 Express 中间件而不打开 HTTP 请求。

    我的印象是您不想要第一个解决方案。然而,这就是我会首先尝试的方法,即使它更慢:

    • 在扩展时更容易将批量连接分布到多个实例。
    • 您不会绕过您可能拥有的任何负载限制机制(防止单个 Express 实例同时处理太多请求)。

    请务必禁用 HTTP Agent

    【讨论】:

    • 谢谢!在尝试之前,我还有一个问题。您认为环回连接方法在性能上是否优于传统的 http 请求方法?对我来说是的。我想知道你的答案。如果它们没有区别,我将使用传统的 Async#map
    • 我尝试将此方法与 Express 框架一起使用,但发现它失败并显示“res.status 不是函数”
    猜你喜欢
    • 2016-09-26
    • 2021-10-08
    • 1970-01-01
    • 2016-10-15
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多