尝试保留未发现的对象类型实体

问题描述 投票:0回答:3

问题

我对

Nest.js
Mikro-ORM
很陌生,作为工作要求我必须学习这些。

这个栈需要

TypeScript
,我打心底里鄙视,但又不得不做。

我已经设置了我的应用程序,当我执行

npm run start:dev
时,它启动时没有问题。

但是,当我尝试向数据库添加某些内容时,它会突然出现并给出以下错误块:

[Nest] 5368   - 07/03/2021, 11:52:15 PM   [ExceptionsHandler] Trying to persist not discovered entity of type object. +183188ms
ValidationError: Trying to persist not discovered entity of type object.
    at Function.notDiscoveredEntity (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/errors.js:51:16)
    at SqlEntityManager.persist (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/EntityManager.js:438:48)
    at SqlEntityManager.persistAndFlush (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/EntityManager.js:449:20)
    at SqlEntityRepository.persistAndFlush (/home/lazar/tuts/backend/node_modules/@mikro-orm/core/entity/EntityRepository.js:21:23)
    at UsersService.create (/home/lazar/tuts/backend/dist/users/users.service.js:47:35)
    at UsersController.create (/home/lazar/tuts/backend/dist/users/users.controller.js:25:40)
    at /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-execution-context.js:38:29
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-execution-context.js:46:28
    at async /home/lazar/tuts/backend/node_modules/@nestjs/core/router/router-proxy.js:9:17

这是我第一次走进这个堆栈,我不知道该错误意味着什么。当我谷歌这个错误时,我没有得到任何有用的信息。我该怎么做才能让它消失?

相关代码

  • 实体(
    User.ts
    )
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";

@Entity()
export class User {
  @PrimaryKey()
  id!: string;

  @Property()
  email!: string;

  @Property()
  name!: string;

  @Property()
  password!: string;

  @Property({ type: 'date' })
  createdAt = new Date()

  @Property({ type: 'date', onUpdate: () => new Date() })
  updatedAt = new Date()
};
  • 控制器 (
    users.controller.ts
    )
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { CreateUserDTO } from './dto/create-user.dto';
import { User } from './interfaces/user.interface';
import { UsersService } from './users.service';
import { User as UserEntity } from "../entities/User"

@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}

  @Post()
  async create(@Body() createUserDto: CreateUserDTO): Promise<User> {
    console.log("CREATEUSERDTO", createUserDto);
    return await this.usersService.create(createUserDto)
  }
}
  • 服务(
    users.service.ts
    )
import { EntityRepository } from '@mikro-orm/core';
import { Injectable } from '@nestjs/common';
import { User } from './interfaces/user.interface';
import { User as UserEntity } from "../entities/User"
import { InjectRepository } from '@mikro-orm/nestjs';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: EntityRepository<UserEntity>
  ) {}

  async create(user: User): Promise<UserEntity> {
    console.log("ALL GOOD");
    const newUser = this.userRepository.create(user)
    console.log("ALL GOOD");
    console.log("NEW USER", newUser);
    await this.userRepository.persistAndFlush(user)
    console.log("ALL GOOD");
    return newUser
  }
}
  • 模块 (
    users.module.ts
    )
import { MikroOrmModule } from '@mikro-orm/nestjs';
import { Module } from '@nestjs/common';
import { User } from 'src/entities/User';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  imports: [MikroOrmModule.forFeature([User])],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService]
})
export class UsersModule {}
  • DTO
export class CreateUserDTO {
  readonly name: string;
  readonly email: string;
  readonly password: string;
  readonly createdAt: Date;
  readonly updatedAt: Date;
}
  • 界面
export interface User {
  id?: string;
  name: string;
  email: string;
  password: string;
  createdAt: Date;
  updatedAt: Date;
}
typescript postgresql nestjs mikro-orm
3个回答
8
投票

正如 Micael Levi 已经在评论中指出的那样,这是由于您试图保留 POJO/DTO 而不是实体实例而导致的。

const dto = { name: '...', email: '...' };
const user = em.create(User, dto);

// this is basically what you are doing and will fail as the prototype
// is just `Object` - which is what you see in the error
em.persist(dto);

// and this is what you need to do instead
em.persist(user);

您始终需要使用实体实例,以便 ORM 知道要使用哪些元数据。如果您只有

Object
,则无法将对象与正确的数据库表关联起来。


1
投票

我遇到了同样的问题,我相信错误与身份映射上下文有关,通过使用合并,它应该将其添加到实体管理器使用的上下文映射中。

em.merge(row)

“将给定实体合并到此 EntityManager,使其成为托管实体。您可以通过第二个参数强制刷新现有实体。默认情况下,它将返回已加载的实体而不修改它们。”


0
投票

而不是这个:-await this.userRepository.persistAndFlush(user); 只需这样做:await persistAndFlush(newUser); 或者你可以这样做:- 坚持(新用户); 冲洗();

© www.soinside.com 2019 - 2024. All rights reserved.