web-dev-qa-db-fra.com

Entité TypeORM dans NESTJS - Impossible d'utiliser l'instruction d'importation en dehors d'un module

Démarrage d'un nouveau projet avec la commande 'nest new'. Fonctionne très bien jusqu'à ce que j'y ajoute un fichier d'entité.

Vous avez l'erreur suivante:

import {Entity, Column, PrimaryGeneratedColumn} de 'typeorm';

^^^^^^

SyntaxError: impossible d'utiliser l'instruction d'importation en dehors d'un module

Qu'est-ce que je manque?

Ajout d'une entité au module:

import { Module } from '@nestjs/common';
import { BooksController } from './books.controller';
import { BooksService } from './books.service';
import { BookEntity } from './book.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forFeature([BookEntity])],
  controllers: [BooksController],
  providers: [BooksService],
})
export class BooksModule {}

app.module.ts:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { BooksModule } from './books/books.module';

@Module({
  imports: [TypeOrmModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
9
Anton

Mon hypothèse est que vous avez une configuration TypeormModule avec une propriété entities qui ressemble à ceci:

entities: ['src/**/*.entity.{ts,js}']

ou comme

entities: ['../**/*.entity.{ts,js}']

L'erreur que vous obtenez est due au fait que vous essayez d'importer un fichier ts dans un contexte js. Tant que vous n'utilisez pas webpack, vous pouvez l'utiliser à la place pour obtenir les fichiers corrects

entities: [join(__dirname, '**', '*.entity.{ts,js}`)]

join est importé du module path. Maintenant, __dirname Se résoudra en src ou dist, puis trouvera respectivement le fichier ts ou js attendu. faites-moi savoir si un problème persiste.

EDIT 1/10/2020

Ce qui précède suppose que la configuration est effectuée est un fichier compatible javascript (.js Ou dans les paramètres TypeormModule.forRoot() passés). Si vous utilisez un ormconfig.json À la place, vous devez utiliser

entities: ['dist/**/*.entity.js']

afin que vous utilisiez les fichiers js compilés et que vous n'ayez aucune chance d'utiliser les fichiers ts dans votre code.

11
Jay McDoniel

Comme Jay McDoniel l'a expliqué dans sa réponse, le problème semble être la correspondance des motifs des fichiers d'entité dans ormconfig.json fichier: un fichier TypeScript (module) est probablement importé à partir d'un fichier javascript (probablement un fichier TypeScript précédemment transposé).

Il devrait suffire de supprimer un modèle global ts existant dans le ormconfig.json, pour que TypeORM ne charge que les fichiers javascript. Le chemin d'accès aux fichiers d'entité doit être relatif au répertoire de travail où le nœud est exécuté.

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
3
iY1NQ

Vous devez avoir un quelque chose.module.ts pour chaque section de votre application. Cela fonctionne comme Angular. Ceci est configuré avec les résolveurs et le service GraphQL. REST est un peu différent avec un contrôleur. Chaque module aura probablement une entité et si GraphQL, projects.schema.graphql.

projects.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ProjectsService } from './projects.service';
import { Projects } from './projects.entity';

import { ProjectsResolvers } from './projects.resolvers';

@Module({
  imports: [
    TypeOrmModule.forFeature([Projects])],
  providers: [
    ProjectsService,
    ProjectsResolvers
  ],

})

export class ProjectsModule {}
1
Preston

Dans la documentation de TypeORM, j'ai trouvé une section spécifique pour TypeScript .

Cette section dit:

Installez ts-node globalement:

npm install -g ts-node

Ajouter une commande typeorm dans la section scripts de package.json

"scripts" {
    ...
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"    
}

Ensuite, vous pouvez exécuter la commande comme ceci:

npm run typeorm migration:run

Si vous devez passer un paramètre avec un tiret au script npm, vous devrez les ajouter après -. Par exemple, si vous devez générer, la commande est la suivante:

npm run typeorm migration:generate -- -n migrationNameHere

Cela fonctionne avec ma configuration de fichier:

{
    "type": "postgres",
    "Host": "yourhost",
    "port": 5423,
    "username": "username",
    "password": "password",
    "database": "your_db",
    "synchronize": true,
    "entities": [
        "src/modules/**/*.entity.{ts,js}"
    ],
    "migrations": [
        "src/migrations/**/*.{ts,js}"
    ],
    "cli": {
        "entitiesDir": "src/modules",
        "migrationsDir": "src/migrations"
    }
}

Ensuite, vous pouvez exécuter la commande generate.

0
Fabio Cortez