Hapi 17:发送响应后执行操作
Hapi 17: Perform an action after response has been sent
我正在将服务升级到 hapi 17,我遇到了一个问题,我不知道如何移植到新的 hapi。
我的处理程序方法过去看起来像这样(基于生成器函数):
removeItem(request, reply) {
function* main() {
const { id } = params;
const removedItem = yield this.apiService.removeComment(id);
reply(removedItem);
this.activityStream
.publishActivity('ITEM_DELETE', item)
.catch(e => this.errorHelper.handleError(e));
}
co(main.bind(this))
.catch(e => reply(this.errorHelper.handleError(e)));
}
这是将它移植到 hapi17 的尝试,但它不起作用 - 它抛出 500,尽管所有操作都很顺利:
async removeItem(request, h) {
try {
const { id } = params;
const removedItem = await this.apiService.removeComment(id);
h.response(removedItem);
this.activityStream
.publishActivity('ITEM_DELETE', item)
.catch(e => this.errorHelper.handleError(e));
} catch(err) {
return this.errorHelper.handleError(err)
}
}
}
你知道如何在 hapi 17 中修复它,使行为相同吗? IE。在最后一个操作完成之前将响应发送给用户。
据我所知,您没有从您的处理程序返回响应。您使用 h.response(removedItem)
创建响应但从未返回。此外,您的 this.activityStream.publishActivity
看起来像是一个承诺,那么您应该在发送请求之前等待或处理其解决方案。
这是我对您的代码的建议,
async function removeItem(request, h) {
try {
const {id} = request.params;
const removedItem = await this.apiService.removeComment(id);
// apparently, this is also looks like a promise, if not, remove the await keyword
await this.activityStream
.publishActivity('ITEM_DELETE', item); // <== where is this ITEM coming from?
// just return your response
return removedItem;
} catch (e) {
// also just return your error or wrap this with a Boom instance
return this.errorHelper.handleError(e);
}
}
我正在将服务升级到 hapi 17,我遇到了一个问题,我不知道如何移植到新的 hapi。
我的处理程序方法过去看起来像这样(基于生成器函数):
removeItem(request, reply) {
function* main() {
const { id } = params;
const removedItem = yield this.apiService.removeComment(id);
reply(removedItem);
this.activityStream
.publishActivity('ITEM_DELETE', item)
.catch(e => this.errorHelper.handleError(e));
}
co(main.bind(this))
.catch(e => reply(this.errorHelper.handleError(e)));
}
这是将它移植到 hapi17 的尝试,但它不起作用 - 它抛出 500,尽管所有操作都很顺利:
async removeItem(request, h) {
try {
const { id } = params;
const removedItem = await this.apiService.removeComment(id);
h.response(removedItem);
this.activityStream
.publishActivity('ITEM_DELETE', item)
.catch(e => this.errorHelper.handleError(e));
} catch(err) {
return this.errorHelper.handleError(err)
}
}
}
你知道如何在 hapi 17 中修复它,使行为相同吗? IE。在最后一个操作完成之前将响应发送给用户。
据我所知,您没有从您的处理程序返回响应。您使用 h.response(removedItem)
创建响应但从未返回。此外,您的 this.activityStream.publishActivity
看起来像是一个承诺,那么您应该在发送请求之前等待或处理其解决方案。
这是我对您的代码的建议,
async function removeItem(request, h) {
try {
const {id} = request.params;
const removedItem = await this.apiService.removeComment(id);
// apparently, this is also looks like a promise, if not, remove the await keyword
await this.activityStream
.publishActivity('ITEM_DELETE', item); // <== where is this ITEM coming from?
// just return your response
return removedItem;
} catch (e) {
// also just return your error or wrap this with a Boom instance
return this.errorHelper.handleError(e);
}
}