Как отловить ошибку в гнезде js при сбое запроса - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в nestjs и пытался преобразовать свой бэкэнд из nodejs в nestjs. Надеюсь, что имеет смысл? Я использую `typeorm. Но я не уверен, что может быть лучшим способом выявления ошибок.

entity.ts

import { Entity, Column, PrimaryGeneratedColumn, PrimaryColumn } from 'typeorm';

@Entity()
export class Course {

  @PrimaryColumn()
  course: string;

  @Column("varchar", { array: true })
  subject: string[];
}

controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CourseService } from './course.service';
import { Course } from './course.entity';

@Controller('course')
export class CourseController {
    constructor(private courseService: CourseService) {}

    @Get()
    getCourses(): Promise<Course[]> {
        return this.courseService.findAll();
    }

    @Post()
    addCourse(@Body() courseDto: Course[]) {
        return this.courseService.create(courseDto);
    }
}

service.ts

import { Injectable, Catch, ExceptionFilter, ArgumentsHost, ConflictException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, QueryFailedError } from 'typeorm';
import { Course } from './course.entity';

@Injectable()
export class CourseService {
    constructor(
        @InjectRepository(Course)
        private courseRepository: Repository<Course>,
    ) { }

    catch(exception: any, host: ArgumentsHost) {
        throw new Error("Error in course service." + exception.code);
    }

    findAll(): Promise<Course[]> {
        return this.courseRepository.find();
    }

    create(courseDto) {
        return this.courseRepository.insert(courseDto)
            .catch((err: any) => {
                // throw new ConflictException();

                switch (err.name) {
                    case 'QueryFailedError':
                        console.log("**++**" + JSON.stringify(err));
                        // throw new Error("Error" + err.message + "" + err.detail);
                        // throw new ConflictException();
                        throw JSON.stringify(err); //"Error creating a course" + err.message + "::: " + err.detail;
                    default:
                        throw err; 

                }
            });
    }
}

Теперь все, что я могу бросить, это throw new ConflictException();. Я хотел выдать разные ошибки в зависимости от результата, например - 1. Для дубликата записи 2. Отсутствие обязательных полей 3. et c

Но не уверен, как мы можем обрабатывать и настраивать то же самое, а также сделать полный использование гнезда js.

Как я вижу в консоли ниже след, но 500, Internal server in postman -

{"message":"duplicate key value violates unique constraint \"PK_d7fc152bc721b3f55a56ed3ad33\"","name":"QueryFailedError","length":293,"severity":"ERROR","code":"23505","detail":"Key (course)=(II) already exists.","schema":"public","table":"course","constraint":"PK_d7fc152bc721b3f55a56ed3ad33","file":"d:\\pginstaller.auto\\postgres.windows-x64\\src\\backend\\access\\nbtree\\nbtinsert.c","line":"535","routine":"_bt_check_unique","query":"INSERT INTO \"course\"(\"course\", \"subject\") VALUES ($1, $2)","parameters":["II",["A","B","C"]]}
[Nest] 12152   - 04/10/2020, 1:18:40 PM   [ExceptionsHandler] {"message":"duplicate key value violates unique constraint \"PK_d7fc152bc721b3f55a56ed3ad33\"","name":"QueryFailedError","length":293,"severity":"ERROR","code":"23505","detail":"Key (course)=(II) already exists.","schema":"public","table":"course","constraint":"PK_d7fc152bc721b3f55a56ed3ad33","file":"d:\\pginstaller.auto\\postgres.windows-x64\\src\\backend\\access\\nbtree\\nbtinsert.c","line":"535","routine":"_bt_check_unique","query":"INSERT INTO \"course\"(\"course\", \"subject\") VALUES ($1, $2)","parameters":["II",["A","B","C"]]} +190924ms

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Не возвращать сервисную функцию напрямую, nest перехватит это исключение и примет его от контроллера, другое решение - обернуть с помощью try / catch

controller.ts

try {
  return await this.courseService.create(courseDto)
} catch (error) {
  // handle error
}

0 голосов
/ 10 апреля 2020

Как насчет передачи ошибок вашему контроллеру, и пусть контроллер выдает эти ошибки.

service.ts

create(courseDto) {
  return this.courseRepository.insert(courseDto)
}

и в вашем контроллере .ts

import {
  Controller,
  Get,
  Post,
  HttpException,
  HttpStatus,
} from '@nestjs/common';

...

@Post()
async addCourse(@Body() courseDto: Course[]) {
    return await this.courseService.create(courseDto).catch(err => {
      throw new HttpException({
        message: err.message
      }, HttpStatus.BAD_REQUEST);
    })
}

https://docs.nestjs.com/exception-filters

...