nestjsx / crud + TypeORM: исправление и публикация результатов в пустом запросе - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь попасть в гнездо js, создав простой REST Api с TypeORM и библиотекой crud. До сих пор я создал аутентификацию на основе рабочей роли, но столкнулся со странной проблемой. Я использовал библиотеку crud для создания простого контроллера для сущности User. GET-запросы работают без проблем. Но я не могу POST создать нового пользователя и не могу использовать PATCH для его обновления. Я думаю, что это может быть очень глупой ошибкой для меня, но так как я не написал много кода, я не могу найти никаких отличий от примеров в do c.

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

{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "Empty data. Nothing to save."
}

Возможно, это связано с проверкой.

Это мой пользовательский контроллер:

import { Controller, UseGuards } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
import { AuthGuard } from '@nestjs/passport';
import { ApiTags, ApiSecurity } from '@nestjs/swagger';
import { RolesGuard } from 'src/auth/role.guard';
import { Roles } from './roles.decorator';
import { Crud, CrudController } from '@nestjsx/crud';

@UseGuards(AuthGuard('jwt'), RolesGuard)
@Crud({
    model: {
        type: User
    },
    routes: {
        exclude: ['createManyBase', 'replaceOneBase'],
    },
    //validation: false,
})
@Roles('admin')
@ApiSecurity('bearer')
@ApiTags('user')
@Controller('user')
export class UserController implements CrudController<User> {
    constructor(public service: UserService) {}
}

Это мой пользовательский сервис:

import { Injectable, Body, NotFoundException } from '@nestjs/common';
import { CreateUserDTO } from './dto/create-user.dto';
import { User } from './user.entity';
import { GetUsersFilterDto } from './dto/get-users-filter.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { UserRepository } from './user.repository';
import { Role } from './role.entity';
import { TypeOrmCrudService } from '@nestjsx/crud-typeorm';

@Injectable()
export class UserService extends TypeOrmCrudService<User> {
    constructor(
        @InjectRepository(User) user,
        private userRepository: UserRepository
    ) {
        super(user);
    }

    async getUserByName(username: string): Promise<User>{
        const found = await this.userRepository.findOne({
            where: {
                username: username,
            }, 
            relations: ["roles"] 
        });
        if (!found){
            throw new NotFoundException('User "${username}" not found!');
        }
        return found;
    }

    async getUserById(id: number): Promise<User>{
        const found = await this.userRepository.findOne(id, {relations: ["roles"] });
        if (!found){
            throw new NotFoundException('User with "${id}" not found');
        }
        return found;
    }



    async matchRoles(roles: string[], userroles: Role[]){
        let match = false;
        console.log(userroles)
        userroles.forEach(r => {
            if (roles.indexOf('r.name')){
                match = true;
            }
        })

        return match;
    }
}

Это субъект:

import { Entity, Column, PrimaryGeneratedColumn, ManyToMany, JoinTable, BeforeInsert, Unique } from 'typeorm';
import { Role } from './role.entity';
import * as bcrypt from 'bcryptjs';
import { Exclude } from 'class-transformer';
import { ApiProperty } from '@nestjs/swagger';


@Entity('auth_user')
@Unique(['username'])
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @ApiProperty()
    @Column({ length: 30 })
    username: string;

    @ApiProperty()
    @Column()
    firstName: string;

    @ApiProperty()
    @Column()
    lastName: string;

    @ApiProperty()
    @Column()
    email: string;


    @BeforeInsert()
    async hashPassword() {
        this.password = await bcrypt.hash(this.password, 10);
    }
    @ApiProperty()
    @Column()//({select: false})
    @Exclude()
    password: string;

    @ApiProperty()
    @Column({ default: true })
    isActive: boolean;

    @ManyToMany(
        type => Role,
        role => role.users,
        { cascade: true },
    )
    @JoinTable()
    roles?: Role[];
}

Любые подсказки приветствуются

1 Ответ

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

Как оказалось, это была проверка. Crud уже имеет активированную проверку, и у меня это было в main.ts:

app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true}));

Так что это было проверено дважды, что как-то привело к пустому телу в запросе. Я удалил это, и теперь я могу опубликовать / патч / положить.

...