如何从hapi.js路由处理程序外部回复

时间:2015-04-01 23:46:49

标签: node.js hapijs

我有一条hapi.js路线,我想推迟回复。我已经尝试存储reply函数并稍后调用它,或将其包装在promise中,但是hapi总是立即响应500内部服务器错误响应。

存储回复以供日后使用:

var pendingReplies = {};
server.route({
    method: "POST",
    path: "/",
    handler: function (request, reply) {
        var id = generateId();
        pendingReplies[id] = reply;
    }
});
... // reply later by calling:
function sendResponse(id, data) {
    pendingReplies[id](data);
}

我已尝试创建回复承诺:

handler: function (request, reply) {
    var id = generateId();
    return new Promise(function (resolve, reject) {
        pendingReplies[id] = resolve;
    }).then(function (data) {
        return reply(data);
    });
}

我尝试过使用reply().hold()

handler: function (request, reply) {
    var id = generateId();
    var response = reply().hold();
    pendingReplies[id] = function (data) {
        response.source = data;
        response.send();
    };
    return response;
}

我尝试将reply().hold()与Promise一起使用:

handler: function (request, reply) {
    var id = generateId();
    var response = reply().hold();
    return new Promise(function (resolve, reject) {
        pendingReplies[id] = resolve;
    }).then(function (data) {
        response.source = data;
        response.send();
        return response;
    });
}

对于其中的每一个,一旦处理程序函数退出,我在节点控制台中得到500响应和以下输出:

Debug: internal, implementation, error
    Error: Uncaught error: socket hang up
    at createHangUpError (_http_client.js:198:15)
    at Socket.socketOnEnd (_http_client.js:283:23)
    at emitNone (events.js:72:20)
    at Socket.emit (events.js:163:7)
    at _stream_readable.js:891:16
    at process._tickDomainCallback (node.js:388:13)

是否可以使用hapi从路由处理程序外部异步回复请求?

1 个答案:

答案 0 :(得分:3)

如果您的处理程序中出现错误,hapi.js将立即退出并提供500状态代码。检查generateId()是否为有效函数。

其余代码看起来适合您的第三个和第四个示例。 <{1}}返回后,必须reply().hold()保持连接处于打开状态。