Как формировать ответ с Ошибками — Nest JS?
У меня есть небольшой бэк на Nest JS, на котором есть некий telegram.validate.service.ts (что бы не сбивать с толку фейк код)
telegram.validate.service.ts
validate(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { return this.validateHash(user) } catch (error) { throw new HttpException({ message: 'Не удалось аутентифицироваться', error }, 500) } } |
validate(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { return this.validateHash(user) } catch (error) { throw new HttpException({ message: 'Не удалось аутентифицироваться', error }, 500) } }
createBotHash(userString: string): string { try { ...... } catch (error) { throw new HttpException({ message: 'Не удалось создать bot hash', error }, 500) } } |
createBotHash(userString: string): string { try { ...... } catch (error) { throw new HttpException({ message: 'Не удалось создать bot hash', error }, 500) } }
validateHash(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { ...... if (botHash !== userHash) return new HttpException('Ошибка при сравнивании хешей', 400) return user } catch (error) { throw new HttpException( { message: 'Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку', error, }, 500 ) } |
validateHash(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { ...... if (botHash !== userHash) return new HttpException('Ошибка при сравнивании хешей', 400) return user } catch (error) { throw new HttpException( { message: 'Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку', error, }, 500 ) }
Когда случается ошибка, например где-то в глубинке, я получаю просто еб*ть какой огромный ответ, например ошибка в createBotHash:
{ "message": "Не удалось аутентифицироваться", "error": { "response": { "message": "Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку", "error": { "response": { "message": "Не удалось создать bot hash", "error": { "code": "ERR_INVALID_ARG_TYPE" } }, "status": 500, "message": "Не удалось создать bot hash", "name": "HttpException" } }, "status": 500, "message": "Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку", "name": "HttpException" } } |
{ "message": "Не удалось аутентифицироваться", "error": { "response": { "message": "Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку", "error": { "response": { "message": "Не удалось создать bot hash", "error": { "code": "ERR_INVALID_ARG_TYPE" } }, "status": 500, "message": "Не удалось создать bot hash", "name": "HttpException" } }, "status": 500, "message": "Ошибка при валидации, если вы все сделали правильно, обратитесь в Тех.Поддержку", "name": "HttpException" } }
хотелось бы увидеть ответ:
{ "response": "текст ошибки (пофиг на вложеность)", "status": 400, "message": "текст ошибки (пофиг на вложеность)", "name": "HttpException" } |
{ "response": "текст ошибки (пофиг на вложеность)", "status": 400, "message": "текст ошибки (пофиг на вложеность)", "name": "HttpException" }
когда происходит ошибка в validate в самой первой функции, вернуть нужно:
{ { ..... } "status": 500, "message": "Не удалось аутентифицироваться", "name": "HttpException" } |
{ { ..... } "status": 500, "message": "Не удалось аутентифицироваться", "name": "HttpException" }
когда происходит ошибка в createBotHash
{ { ..... } "status": 500, "message": "Не удалось создать bot hash", "name": "HttpException" } |
{ { ..... } "status": 500, "message": "Не удалось создать bot hash", "name": "HttpException" }
и так далее, главная проблема в том что когда случается ошибка где-то в глубинке, я получаю огромный ответ, с пачкой ошибок, конечно же если это считается нормой то окей, но что-то мне подсказывает что так не должно быть, скорее всего ошибка в моей структуре кода, а именно в каком то не правильном возврате ошибок.
так же побывал не обворачивать каждую функцию в try/catch, но это еще та хрень, получается что когда ошибка ложится сервер, а так мне точно не надо.
ребят, поделитесь опытом, как правильно выстроить работу с функциями в моем telegram.validate.service.ts так что бы нормально возвращать ошибку, нужную ошибку, что бы можно было понять на клиенте, где именно ошибка, а не разворачивать огромный объект ответа. Повторюсь возможно это считается нормой, если это так, так и напишите. Спасибо !
Дополнительно:
Ответы:
Оставьте один try/catch на самой внешней функции, будете получать только одно исключение.
- так а если сервер ложится если происходит ошибка на какой-то внутренней функции, как от туда убрать try/cath, или убрать только возврат ошибки ?
- Max Sagaidak, catch ловит исключение по всей вложенности функций, вызываемых в блоке try.
function foo() { throw new Error('Error in foo'); } function buz() { foo(); } function biz() { buz(); } try { biz(); } catch (e) { console.log(e.message); } // Error in foo
function foo() { throw new Error('Error in foo'); } function buz() { foo(); } function biz() { buz(); } try { biz(); } catch (e) { console.log(e.message); } // Error in foo
- Rsa97, сделал как ты и говорил, убрал лишние HttpException:
validate(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { return this.validateHash(user) } catch (error) { throw new HttpException('Не удалось провалидировать ваши данные', 400, { description: error }) } } createBotHash(userString: string): string { } createUserString(user: TValidateUserResponse): string { } validateHash(user: ResponseVkUserDto): TValidateUserResponse | HttpException { } }
validate(user: ResponseVkUserDto): TValidateUserResponse | HttpException { try { return this.validateHash(user) } catch (error) { throw new HttpException('Не удалось провалидировать ваши данные', 400, { description: error }) } } createBotHash(userString: string): string { } createUserString(user: TValidateUserResponse): string { } validateHash(user: ResponseVkUserDto): TValidateUserResponse | HttpException { } }
ток вот теперь вопрос
а если мне понадобиться дернуть например validateHash не через функцию validate а на прямую, а у нее судя по коду нет обертки try/catch, тогда получается сервер ляжет. Как быть с этим, какие решения ? - Max Sagaidak, Ставить один единственный try...catch в единой точке входа.
- Rsa97, ема я тулобень, я ток ща понял как это просто фиксится, рил тупо где вызываешь ставишь try/catch, мдааа.... Спасибо большое)
Убери везде свой HttpException, кроме самого верха, как сказал Rsa97 и оставь один на самом верху:
try { return this.validateHash(user) } catch (error) { throw new HttpException(error, 500) } |
try { return this.validateHash(user) } catch (error) { throw new HttpException(error, 500) }
- так а если сервер ложится если происходит ошибка на какой-то внутренней функции, как от туда убрать try/cath, или убрать только возврат ошибки ?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы эффективно решить проблему с ошибками в Nest JS, важно следовать определенным шагам. Вот несколько рекомендаций, которые могут помочь вам в этом процессе:
1. Логирование ошибок: Один из основных способов выявления и исправления ошибок - это использование логирования. Вы можете настроить логирование в вашем приложении Nest JS, чтобы отслеживать возникающие ошибки. Для этого вы можете использовать стандартный модуль logging в Nest JS или любую популярную библиотеку логирования, такую как Winston или Bunyan.
2. Обработка ошибок: В Nest JS есть встроенная функциональность для обработки ошибок. Вы можете использовать middleware для обработки ошибок, которые возникают в вашем приложении. Например, вы можете создать middleware для перехвата и обработки исключений или ошибок в вашем приложении.
3. Тестирование приложения: Тестирование вашего приложения Nest JS поможет выявить потенциальные ошибки до их появления в продакшене. Вы можете написать unit-тесты, интеграционные тесты или e2e-тесты, чтобы обеспечить работоспособность и надежность вашего приложения.
4. Использование сторонних инструментов: В случае, если у вас возникают сложности с обработкой ошибок в Nest JS, вы также можете обратиться к сторонним инструментам, таким как Sentry, Rollbar или Bugsnag, которые помогут вам отслеживать и исправлять ошибки в вашем приложении.
Надеюсь, эти рекомендации помогут вам эффективно управлять ошибками в вашем приложении на Nest JS. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.