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 {}
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}`)]
où 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.
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.
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"
],
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 {}
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.