data: null в hapi.js preResponse, если выдана ошибка - PullRequest
0 голосов
/ 12 июня 2019

я выкидываю и ошибка вот так где то в коде режима:

throw new Error({
    name: 'notFound',
    message: 'Book not found'
});

И у меня есть onPreResponse расширение сервера:

server.ext('onPreResponse', async ({ response }, h) => {
    if (isErrorResponse(response)) {
        // So, here the "data" property is null and I can not access name and message
        console.dir(response);
    }
    return h.continue;
});

Поскольку данные имеют нулевое значение, я не могу получить доступ к своему имени и сообщению. Но если я брошу нормальный объект, у меня будут эти два свойства просто отлично. Хотя это было бы ошибкой хапи Cannot throw non-error object

1 Ответ

0 голосов
/ 12 июня 2019

Без особых знаний о намерении фиксировать ошибки с помощью onPreResponse, здесь может быть несколько вещей, которые можно рассмотреть

https://hapijs.com/api#-requestresponse

Объект ответа при установке. Объект может быть изменен, но не должен назначить другой объект. Заменить ответ другим в пределах точки расширения верните новое значение ответа. Содержит ноль когда ответ не был установлен (например, когда запрос заканчивается преждевременно, когда клиент отключается).

Таким образом, нулевые данные - это ожидаемое поведение, поэтому я понимаю, что вы хотите как-то обогатить ошибки. Ошибка, выдаваемая в Hapi, автоматически преобразуется в объект Boom , теперь вы пытаетесь выбросить, и ошибка, созданная неправильно, см. Документация конструктора ошибок первый параметр - это сообщение об ошибке, а не пользовательский объект. Вместо этого вы можете использовать ошибку Boom, которую конструктор позволяет вам помещать в нее пользовательские данные, например,

throw new Boom('Book not found', { statusCode: 404, decorate: { custom: 'custom' } });

Так что если вы бросите это, вы должны увидеть следующие свойства

{
  "data": null,
  "isBoom": true,
  "isServer": false,
  "output": {
    "statusCode": 404,
    "payload": {
      "statusCode": 404,
      "error": "Not Found",
      "message": "Book not found"
    },
    "headers": {}
  },
  "custom": "custom"
}

Теперь вы можете добавить запись в журнал, чтобы проверить, является ли ответ ошибкой (if (response.isBoom)), и прочитать пользовательскую информацию, переданную вашей ошибкой. В любом случае, я думаю, что лучше не использовать этот тип логики в расширении onPreResponse, я бы попытался использовать обычную ошибку обработки пузырьковых ошибок из более глубоких слоев в обработчик запросов и возвращать надлежащую ошибку Boom оттуда.

...