Как обрабатывать ошибки проверки hapi?

У меня есть следующий код маршрута для hapi ...


const routeConfig = {
  method: 'POST',
  path: '/user',
  config: {
    validate: {
      payload: {
        firstName: Joi.string().required(),
      }
    },
    handler
  }
}

Поэтому, когда я не передаю firstName, он выдает ошибку, подобную этой

{
    "statusCode": 400,
    "error": "Bad Request",
    "message": "child \"firstName\" fails because [\"firstName\" is required]",
    "validation": {
        "source": "payload",
        "keys": [
            "firstName"
        ]
    }
}

Теперь мне нужно обработать указанную выше ошибку в catch

const handler = async(request, reply) => {
  try {
    const payload = request.payload
    const createUser = await User.create(payload)
    let token = Helpers.createJwt(createUser) 
    reply({ success: true, message: 'User created successFully', token })
  } catch(err) {
     // need to do something here to handle the error like
     if (err) {
       reply ({ error: "firstName is required", message: "Signup unsuccessfull" })
     }
  }
}

person Ashh    schedule 14.05.2018    source источник


Ответы (2)


Есть гораздо лучшее решение:

config: {
        validate: {
            payload: {
                firstName: Joi.string().required(),
            },
            failAction(request, reply, source, error) {
              reply({
                error: 'badRequest',
              }).code(400);
            },
        },
    },

Если проверка Joi не удалась, она вызовет failAction, и вы сможете обработать ошибку (отправив ее в службу журнала и / или вернув конкретное сообщение).

Это немного скрыто в документе, но здесь есть соответствующая часть.

Признаюсь, с hapi 17 не пробовал ...

person Ernest Jones    schedule 14.05.2018
comment
Рад, что смог помочь - person Ernest Jones; 14.05.2018
comment
Ваше право ... И документация по этому поводу не совсем ясна - person Ernest Jones; 14.05.2018
comment
Привет, Эрнест ... У меня вопрос ... когда я запускаю свой сервер hapi, он не показывает никаких журналов ... Ты хоть представляешь это? Если вы знаете ответ, я задам ему вопрос. - person Ashh; 01.08.2018
comment
Да, у меня есть ответ. Проверьте раздел создания сервера здесь, hapijs.com/tutorials. Для версии hapi ниже 17 вы должны поместить console.log в обратный вызов server.start - person Ernest Jones; 01.08.2018
comment
Вы имеете в виду это options: { prettyPrint: false, logEvents: ['response'] } ?? - person Ashh; 01.08.2018
comment
Это если вы хотите использовать плагин hapi-pino (никогда о нем не слышали) ... Самое простое решение - const init = async () => { await server.start(); console.log('Server running at: ${server.info.uri}'); }; - person Ernest Jones; 01.08.2018
comment
Привет, Эрнест. Можно ли использовать шлем npm в рамках hapi? - person Ashh; 29.01.2019
comment
Никогда не слышал о шлеме… Быстрый поиск = ›Helmetjs.github.io/see-also Это кажется, что рекомендуется что-то с именем blankie (github.com/nlf/blankie) - person Ernest Jones; 29.01.2019
comment
Привет, Эрнест, у тебя есть ответ на этот stackoverflow.com/questions/54516579/ - person Ashh; 05.02.2019
comment
Привет, Эрнест, ты знаешь, как развернуть код hapi на aws lambda. Любезный ответ - person Ashh; 18.03.2019
comment
Привет, Энтони. Я немного поработал над бессерверными вариантами для hapi. Самая большая проблема, с которой я столкнулся, связана с маршрутизацией (потому что у вас больше нет сервера для ее обработки). Что касается Lambda, я немного поработал с этим. Мой совет - перейти непосредственно к бессерверному фреймворку и удалить Hapi из вашего кода. (Вот быстрое видео youtube.com/) Возможно, движок приложений Google лучше, потому что он будет запускать ваш код hapi напрямую, и у вас есть преимущества без сервера (плата за потребление и масштабирование) - person Ernest Jones; 18.03.2019
comment
В конце попытки заставить Hapi работать на Lambda я нашел статью, объясняющую, как сохранить маршрутизацию на Hapi и прохождение через AWS API Gateway, но я больше не могу ее найти, но она существует где-то в Интернете. - person Ernest Jones; 18.03.2019
comment
Привет, Эрнест, у меня вопрос. Не могли бы вы помочь? - person Ashh; 17.07.2019
comment
Может, загорелась! - person Ernest Jones; 17.07.2019
comment
Круто ... Мне нужно интегрировать Sentry в мой сервер hapi. Поэтому мне нужен общий файл, из которого все запросы проходят на сервере hapi. Так что всякий раз, когда у меня что-то не получается, я использую Sentry. В целом мне нужен общий обработчик для всех файлов. Является ли это возможным? Кстати, у вас установлено какое-нибудь приложение, вы молниеносно работаете - person Ashh; 17.07.2019
comment
У меня установлено приложение. Во-первых, я не устанавливал часовую на наших серверах, но она есть. Итак, насколько я могу судить, фатальные ошибки обнаруживаются автоматически. Мы также создаем модуль, который форматирует ошибки в соответствии с нашими потребностями и отправляет их через raven.captureException. Используется для нефатальных ошибок. В этом модуле вы захотите передать запрос для отладки. Больше ничем не могу помочь. Удачи. - person Ernest Jones; 17.07.2019
comment
Привет, Эрнест, не могли бы вы проверить это < / а> - person Ashh; 01.10.2019

Может стоит попробовать с чем-то таким?

const routeConfig = {
  method: 'POST',
  path: '/user',
  config: {
    validate: {
      payload: {
        firstName: Joi.string().required().error(new Error('firstName is required')),
      }
    },
    handler
  }
}

Взгляните на эту страницу здесь

Надеюсь, это поможет.

person Sparw    schedule 14.05.2018
comment
Спасибо, Спарв ... есть ли лучший способ сделать это? - person Ashh; 14.05.2018
comment
Я не уверен, что есть лучший способ сделать это должным образом ..: / - person Sparw; 14.05.2018
comment
Ваш ответ помогает мне изменить сообщение, а ответ Эрнеста помогает мне вернуть это сообщение ... Так что спасибо, он работает ... - person Ashh; 19.05.2018