6
votes

Les métadonnées d'entité pour les utilisateurs du rôle n ° sont introuvables

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.


0 commentaires

6 Réponses :


10
votes

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


2 commentaires

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.



1
votes

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.


0 commentaires

7
votes

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: [...],
})


0 commentaires

0
votes

Je résous mon problème

Dans un fichier que j'avais

import { Role} from "./models/category";


0 commentaires

1
votes

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.


0 commentaires

0
votes

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.)


0 commentaires