【问题标题】:onPostHandler extension not called when an error is thrown in the handler在处理程序中引发错误时未调用 onPostHandler 扩展
【发布时间】:2020-05-29 16:24:59
【问题描述】:

我正在从 hapi14 升级到 hapi17,当在处理程序中抛出或返回错误时 onPostHandlers 未被调用,这未列为 16 或 17 中的重大更改。

我相信这是从回调更改为异步的结果,但我很想确认它或找出在处理程序中抛出错误时阻止调用 onPostHandler 扩展的问题.

const Boom = require('boom');

const extensions = {
  handleOnPostHandler: function (request, h) {
    console.log('we hit it wooo');
    return h.continue;
  }
};

const operations = {
  error: {
    description: 'Endpoint that simulates errors',
    auth: false,
    handler: function (request, h) {
      // comment me out to call the onPostHandler
      throw new Boom('an error');

      // uncomment me to call the onPostHandler
      // return 'potato';
    }
  }
};

exports.register = function (server) {
  server.ext('onPostHandler', extensions.handleOnPostHandler);
  server.route({ method: 'GET', path: '/debug/error', config: operations.error });
};

我是否遗漏了一个严重的错误或者这是预期的?

【问题讨论】:

  • 我有一个使用 onPreResponse 的解决方法,如果它在几天内没有收到好的答案,我会回答这个问题

标签: node.js hapijs


【解决方案1】:

这是一个未记录的功能,已在 Hapi6 中删除,因此在升级到 >16 时无法模拟此功能。

【讨论】:

    【解决方案2】:

    因为您在请求结束之前抛出错误?只需从您的处理程序返回,然后您的 handleOnPostHandler 将被调用。

    life cycle methods 的列表中显示

    路由处理程序

    执行路由处理程序。

    onPostHandler

    request.response 中包含的响应可能会被修改(但不能 分配了一个新值)。返回不同的响应类型(对于 例如,用 HTML 响应替换错误),返回一个新的 响应值。

    但是你不允许你的处理程序继续到 onPostHandler,你正在抛出一个错误。它接管了响应。

    【讨论】:

    • 如果你返回一个 Boom 你仍然会跳过 onPostHandler。
    • 我就是这么说的。
    • 不,不是。您说过要从处理程序返回,如果我返回错误,这是我在这种情况下想要做的,我无法访问 onPostHandler。这以前在 Hapi14 中有效。
    猜你喜欢
    • 2017-01-05
    • 2013-01-20
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多