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



我有一个hapi.js路由,我想推迟响应。我尝试过存储reply函数并稍后调用它,或者将其包装在promise中,但hapi总是立即响应500 Internal Server Error响应。

存储回复以便稍后使用:

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;
}

我尝试过使用带有Promise的reply().hold()

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响应和以下输出:

调试:内部、实现、错误错误:未捕获错误:套接字挂起在createHangUpError(_http_client.js:198:15)位于Socket.socketOnEnd(_http_client.js:283:23)在emitOne(events.js:72:20)在Socket.eemit(events.js:163:7)网址:_stream_readable.js:891:16正在处理中_tickDomainCallback(node.js:38:13)

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

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

您的代码的其余部分看起来适合您的第三个和第四个示例。CCD_ 7是在CCD_ 8返回之后保持连接打开所必需的。

自版本8以来,Hapi支持Promised响应,因此您可以执行:

var respond = function(message) {
    return new Bluebird.Promise(function(resolve, reject) {
        setTimeout(() => {
            resolve(message);
        }, 2000);
    });
};
server.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {
        reply(respond("Hello buddy"));
    }
});

最新更新