Essayer d'établir une relation OneToMany et ManyToOne avec typeorm mais j'obtiens cette erreur, je ne sais pas ce qui ne va pas avec mon code.
j'ai une table d'utilisateurs:
import { BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; import { Field, ID, ObjectType } from 'type-graphql'; import { User } from '.'; @ObjectType() @Entity() export class Role extends BaseEntity { @Field(() => ID) @PrimaryGeneratedColumn() public id: number; @Field() @Column('text', { unique: true }) public name: string; @OneToMany(() => User, user => user.role, { lazy: false }) @Field(() => [User], { nullable: true }) public users: User[]; }
et une table de rôle:
import { BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; import { Field, ID, ObjectType } from 'type-graphql'; import { Role } from './'; @ObjectType() @Entity() export class User extends BaseEntity { @Field(() => ID) @PrimaryGeneratedColumn() public id: number; @Field() @Column('text', { unique: true }) public userName: string; @Column() public password: string; @Field() @Column('boolean', { default: true }) public isActive: boolean; @ManyToOne(() => Role, role => role.users) @Field(() => Role, { nullable: true }) public role: Role; }
Cependant, je continue à recevoir cette erreur
(nœud: 4541) UnhandledPromiseRejectionWarning: Erreur: les métadonnées d'entité pour les utilisateurs de rôle # sont introuvables. Vérifiez si vous avez spécifié un objet entité correct et s'il est connecté dans les options de connexion. [1] sur /Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:571:23 [1] sur Array.forEach () [1] sur EntityMetadataBuilder.computeInverseProperties (/ Users / soufiane / projects / pos / node_modules / typeorm / metadata-builder / EntityMetadataBuilder.js: 567: 34) [1] à /Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:80:74 [1 ] sur Array.forEach () [1] sur EntityMetadataBuilder.build (/Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:80:25) [1] sur ConnectionMetadataBuilder.buildatas (Users) /soufiane/projects/pos/node_modules/typeorm/connection/ConnectionMetadataBuilder.js:57:141) [1] à Connection.buildMetadatas (/Users/soufiane/projects/pos/node_modules/typeorm/connection/Connection.js:49 57) [1] à la connexion. (/Users/soufiane/projects/pos/node_modules/typeorm/connection/Connection.js:126:30) [1] à l'étape (/Users/soufiane/projects/pos/node_modules/tslib/tslib.js:136:27 ) [1] (nœud: 4541) UnhandledPromiseRejectionWarning: Rejet de promesse non géré. Cette erreur est née soit en jetant à l'intérieur d'une fonction asynchrone sans bloc catch, soit en rejetant une promesse qui n'a pas été gérée avec .catch (). (identifiant de rejet: 1) [1] (nœud: 4541) [DEP0018] DeprecationWarning: les rejets de promesse non gérés sont obsolètes. À l'avenir, les refus de promesse qui ne sont pas traités mettront fin au processus Node.js avec un code de sortie différent de zéro.
6 Réponses :
Cela signifie simplement que vos entités ne se chargent pas ou ne se chargent pas correctement
Vous devez corriger le chargement de vos entités. Les entités seront généralement chargées à partir du fichier ormconfig
Créez simplement un fichier ormconfig.js et tapez quelque chose comme ça, en mettant l'accent sur les entités
module.exports = { "name": "default", "type": "mongodb", "host": "localhost", "port": "27017", "username": "root", "password": "", "database": "rocketlaunches", "entities": [ __dirname + "entities/**/*.entity.ts" ] }
Maintenant évidemment, vous chargeriez vos entités où qu'elles se trouvent sur votre projet
Bonne réponse, rappelez-moi de vérifier ce nom de fichier * .entity.ts, pense.
ne pensait pas avoir besoin du chemin complet. Voir le __dirname m'a sauvé beaucoup de raison.
Mon problème était que j'utilisais node-ts pour exécuter uniquement les fichiers dactylographiés de mon projet. Cependant, ma version émettait toujours des fichiers .js qui étaient ignorés / masqués. Je ne sais pas pourquoi, mais le nettoyage des fichiers compilés * .js et * .js.map a fonctionné. Ce qui est étrange, c'est que mon ormconfig ne spécifie que les fichiers .ts.
Je recommande d'ajouter les options du compilateur "noEmit": true
aux tsconfig.json pour éviter de futurs maux de tête avec une approche similaire.
J'utilise NestJS avec PostgreSQL et j'ai eu le même problème. Le problème était par moi que j'ai oublié d'importer l'entité dans le module avec la fonction TypeOrmModule.forFeature
.
@Module({ imports: [TypeOrmModule.forFeature([Users, ...])], <--- Importing the entity! controllers: [...], providers: [...], exports: [...], })
Je résous mon problème
Dans un fichier que j'avais
import { Role} from "./models/category";
J'ai rencontré le même problème.
TypeORM est très difficile à déboguer avec des args et des classes / collections de méta-données partout. Après de nombreuses heures, j'ai pu le comprendre.
Cette relation échoue donc car EntityMetadataBuilder.ts essaie de lier le type de la colonne ManyToOne à un type d'entité connu en utilisant "===".
var inverseEntityMetadata = entityMetadatas.find (function (m) {return m.target === relation.type || (typeof relation.type === "string" && m.targetName === relation.type);});
En regardant relation.type, je pouvais voir que c'était le même "type" que m.target mais ils ne pointaient pas vers la même référence du type défini. Il me semblait que ma classe associée était chargée par nœud plus d'une fois. Après avoir lu comment le nœud met en cache les modules, j'ai pu résoudre mon problème en m'assurant que toutes mes instructions d'importation faisaient référence au même fichier, y compris les lettres majuscules / minuscules dans la chaîne.
Dans un fichier que j'avais
import {Transaction} de "./transaction";
et l'autre que j'avais
import {Transaction} de "./Transaction";
Notez le "t" majuscule. Après avoir remplacé par un "T" minuscule, tout a fonctionné comme prévu.
Dans mon projet, TypeORM est initialisé comme ceci:
import { createConnection } from 'typeorm'; const conn = await createConnection({ // Make sure to specify all entities here entities: [User, Role], // ... More options })
Il suffit de s'assurer que les entities
répertorient toutes vos entités.
(C'est l'alternative si vous n'utilisez pas ormconfig.js
pour spécifier des entités.)