我有一个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"));
}
});