Хапи 17: выполнить действие после отправки ответа - PullRequest
0 голосов
/ 09 января 2019

Я обновляю сервис до 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 голосов
/ 10 января 2019

Насколько я могу судить, вы не возвращаете ответ от вашего обработчика. Вы создаете ответ с 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

...