Я пытаюсь попасть в гнездо 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[];
}
Любые подсказки приветствуются