Nest. js отправка пользовательского ответа клиенту из исключения - PullRequest
0 голосов
/ 02 мая 2020

Я столкнулся с проблемой, которую хотел бы исправить ...

Я работаю над проектом, использующим Nest. js в качестве Backend Framework для API и Nuxt. js для клиента ... Все работает нормально, но когда я пытаюсь выдать ошибку в сервисе, который вводится в контроллер, я не могу отправить пользовательский ответ клиенту. Те сценарии ios, с которыми я столкнулся:

account.service.ts

 async createAccount(_account: AccountEntity){
    return await this.accountRepository.save(_account)
}

async _accountExists(_account: AccountEntity) {
    const itExists = await this.findOne(_account)
    if(itExists){
        throw new ConflictException(`Username already exists!`)
    }
}

account.controller.ts

@Post()
@UseFilters(new HttpExceptionFilter())
async createAccount(@Body() userAccount: createAccountDto, @Res() res: Response) {
    try {
        await this.accountService._accountExists(userAccount).then(async () => {
            return await this.accountService.createAccount(userAccount)
        })
    } catch (e) {
        res.status(e.status).json(e.message)
    }
}

Это возвращает мне эту ошибку в клиенте, если пользователь уже существует, но он не отправляет json клиенту.

POST http://localhost:3000/account 409 (Conflict)
Request failed with status code 409

Если я изменяю его res. json (e ), он отправляет мне клиенту сообщение об ошибке со статусом 201, как вы можете видеть на изображении, но ответ хорош во всех сценариях ios. enter image description here Итак, вопрос в том ... как я могу получить этот ответ с правильным кодом состояния?

Это фильтр исключений:

 import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
    import { Request, Response } from 'express';

    @Catch(HttpException)
    export class HttpExceptionFilter implements ExceptionFilter {
        catch(exception: HttpException, host: ArgumentsHost) {
            const ctx = host.switchToHttp();
            const response = ctx.getResponse<Response>();
            const request = ctx.getRequest<Request>();
            const status = exception.getStatus();

            response
                .status(status)
                .json({
                    statusCode: status,
                    name: exception.name,
                    message: exception.message.message,
                    timestamp: new Date().toISOString(),
                    path: request.url,
                });
        }
    }

1 Ответ

0 голосов
/ 02 мая 2020

Кажется, что сама проблема была не в сервере, а в клиенте. Журнал ошибки не регистрирует объект, вам нужно зарегистрировать errors.response

...