Hapi 17:发送响应后执行操作

时间:2019-01-09 13:26:16

标签: javascript node.js hapijs

我正在将服务升级到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中对其进行修复,以使行为相同吗?即响应会在上一个动作完成之前发送给用户。

1 个答案:

答案 0 :(得分:0)

据我所知,您没有从处理程序返回响应。您使用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);
    }
}

景气:https://github.com/hapijs/boom