Почему метод findOne хранилища TypeORM возвращает простые объекты? - PullRequest
1 голос
/ 04 мая 2020

Я недавно понял, что с помощью typeorm, когда я отделяю свое определение сущности от моего класса модели и использую соответствующий репозиторий, некоторые методы, например findOne, возвращают простые объекты вместо экземпляров класса модели. Я хотел бы знать, является ли это ожидаемым поведением или я что-то теряю в своей реализации.

Следующий код воспроизводит описанную ситуацию:


import { EntitySchema, createConnection } from 'typeorm'

class Nameable {
  id: number
  name: string
}

const NameableSchema = new EntitySchema<Nameable>({
  name: 'nameable', 
  columns: { 
    id: { type: Number, primary: true, generated: 'increment' },
    name: { type: String }
  }
})

createConnection({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "logbook",
  password: "logbook",
  database: "logbook",
  entities: [ NameableSchema ], 
  synchronize: true 
})
.then(databaseConnection => databaseConnection.getRepository(NameableSchema))
.then(nameableRepository => nameableRepository.findOne({ where: { id: 1 }}))
.then(findedNameable => console.log(findedNameable))

В этом случае, учитывая, что в моей базе данных есть постоянный кортеж, значение id которого равно 1, console.log(findedNameable) печатает из следующего:

{ id: 1, name: 'NameableName' }

Однако я ожидал чего-то подобного:

Nameable { id: 1, name: 'NameableName' }

Я провел несколько тестов с использованием декораторов в своем классе моделей и, насколько я мог видеть, в этом случае все экземпляры, возвращаемые методами репозитория, были экземплярами из моего соответствующего класса модели. В этом примере с использованием декораторов действительно показано ожидаемое поведение:

import { createConnection, Entity, PrimaryGeneratedColumn, Column } from 'typeorm'

@Entity()
class Nameable {

  @PrimaryGeneratedColumn()
  id: number

  @Column()
  name: string
}

createConnection({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "username",
  password: "password",
  database: "database",
  entities: [ Nameable ], 
  synchronize: true 
})
.then(databaseConnection => databaseConnection.getRepository(Nameable))
.then(nameableRepository => nameableRepository.findOne({ where: { id: 1 }}))
.then(findedNameable => console.log(findedNameable))

Что происходит, так это то, что я действительно хотел бы отделить определения своих сущностей от своих моделей, поэтому я пока не рассматривал возможность использования декораторов для решения этой проблемы ,

Кроме того, я не смог найти в документации ничего, указывающего на то, что наличие отдельного определения сущности может повлиять на поведение классов репозитория.

1 Ответ

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

Похоже, что при использовании определений EntitySchema, отделенных от классов модели, вам необходимо указать значение target внутри параметра options, указывающее класс, к которому вы хотите подключиться. Также значение name должно быть равно названию класса модели.

Следующее определение EntitySchema должно заставить код вопроса работать как положено:

const NameableSchema = new EntitySchema<Nameable>({
  name: Nameable.name, // Or 'Nameable', as you wish
  target: Nameable,
  columns: { 
    id: { type: Number, primary: true, generated: 'increment' },
    name: { type: String }
  }
})
...