TypeORM-Entität in NESTJS - Importanweisung kann nicht außerhalb eines Moduls verwendet werden

11

Neues Projekt mit dem Befehl 'nest new' gestartet. Funktioniert einwandfrei, bis ich eine Entitätsdatei hinzufüge.

Erhielt folgenden Fehler:

{Entity, Column, PrimaryGeneratedColumn} aus 'typeorm' importieren;

^^^^^^

SyntaxError: Importanweisung kann nicht außerhalb eines Moduls verwendet werden

Was vermisse ich?

Entität zum Modul hinzufügen:

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 {}
Anton
quelle
{Modul} aus '@ nestjs / common' importieren;
Preston
@ Preston möchten Sie näher erläutern, was Sie meinen? Müssen Sie ein Modul für gemeinsam genutzte Dateien erstellen?
Joshua de Leon
Erhalten Sie den Fehler von Ihrem Linter oder von einer Zusammenstellung? Wo haben Sie diese neue Datei? Ist es in deinem srcVerzeichnis? Wenn Sie TypeORM verwenden, können Sie zeigen Ihren TypeOrmModuleImport in dem AppModule‚s importsArray? Möglicherweise stimmt etwas mit der Konfiguration nicht, die wir nicht sehen können
Jay McDoniel
aktualisierter Beitrag mit Entitätsimportinformationen
Anton

Antworten:

20

Ich gehe davon aus, dass Sie eine TypeormModuleKonfiguration mit einer entitiesEigenschaft haben, die folgendermaßen aussieht:

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

oder wie

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

Der Fehler, den Sie erhalten, ist, dass Sie versuchen, eine tsDatei in einen jsKontext zu importieren . Solange Sie kein Webpack verwenden, können Sie dieses stattdessen verwenden, um die richtigen Dateien zu erhalten

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

wo joinwird aus dem pathModul importiert . Jetzt __dirnamewird in srcoder aufgelöst distund dann die erwartete tsbzw. jsDatei gefunden. Lassen Sie mich wissen, ob noch ein Problem vorliegt.

EDIT 1/10/2020

Das Obige setzt voraus, dass die Konfiguration eine Javascript-kompatible Datei ist ( .jsoder in den TypeormModule.forRoot()übergebenen Parametern). Wenn Sie stattdessen ein ormconfig.jsonverwenden, sollten Sie verwenden

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

Damit Sie die kompilierten js-Dateien verwenden und keine Chance haben, die ts-Dateien in Ihrem Code zu verwenden.

Jay McDoniel
quelle
1
Aber das ist ein totales Durcheinander. Ein Typoskript-ORM, das kein Typoskript für die Migrationen akzeptiert ...
Madeo
denoist der einzige native Typoskript-Code-Runner. TypeORM, während es Typescript verwendet, funktioniert immer noch mit Nodeund der JavaScript-Laufzeit. Möglicherweise können Verbesserungen vorgenommen werden, um tsDateien zu akzeptieren und sie unter der Haube in JavaScript zu kompilieren und dann zu löschen, damit der Endbenutzer sie nicht sieht. Dies müsste jedoch als Problem im TypeORM-Git-Repository
angesprochen werden
4

Wie Jay McDoniel in seiner Antwort erklärte, scheint das Problem der Mustervergleich von Entitätsdateien in einer ormconfig.jsonDatei zu sein: Wahrscheinlich wird eine Typoskriptdatei (Modul) aus einer Javascriptdatei (vermutlich eine zuvor transpilierte Typoskriptdatei) importiert.

Es sollte ausreichen, ein vorhandenes tsGlob-Muster im zu entfernen ormconfig.json, damit TypeORM nur Javascript-Dateien lädt. Der Pfad zu den Entitätsdateien sollte relativ zum Arbeitsverzeichnis sein, in dem der Knoten ausgeführt wird.

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
iY1NQ
quelle
Das srcsollte wahrscheinlich geändert werden, distda sich dort der ausführbare Code befindet, nachdem er in Javascript transpiliert wurde.
Jay McDoniel
Danke, ich habe die Pfade aktualisiert.
iY1NQ
2

In der TypeORM-Dokumentation habe ich einen bestimmten Abschnitt für Typescript gefunden .

Dieser Abschnitt sagt:

Installieren Sie ts-node global:

npm install -g ts-node

Fügen Sie den Befehl typeorm im Abschnitt scripts in package.json hinzu

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

Dann können Sie den Befehl folgendermaßen ausführen:

npm run typeorm migration:run

Wenn Sie Parameter mit Bindestrich an das npm-Skript übergeben müssen, müssen Sie sie nach - hinzufügen. Wenn Sie beispielsweise generieren müssen, lautet der Befehl wie folgt:

npm run typeorm migration:generate -- -n migrationNameHere

Dies funktioniert mit meiner Dateikonfiguration:

{
    "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"
    }
}

Anschließend können Sie den Befehl generate ausführen.

Fabio Cortez
quelle
Dies sollte die akzeptierte Antwort sein
Nico Li
1

Sie müssen für jeden Abschnitt Ihrer App ein Something.module.ts haben. Es funktioniert wie Angular. Dies wird mit GraphQL-Resolvern und -Dienst eingerichtet. REST ist bei einem Controller etwas anders. Jedes Modul wird wahrscheinlich eine Entität haben und wenn 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 {}
Preston
quelle
Ausgezeichnet. Bedeutet das also, dass Sie jemals eine Basisentität haben können, die von mehreren Modulen gemeinsam genutzt wird, oder müsste diese Basisentität Teil einer Art Commons-Modul sein?
Joshua de Leon
Wahrscheinlich wie Angular, aber nie ausprobiert.
Preston
Wenn dies funktioniert, markieren Sie es bitte als Antwort.
Preston
Ich glaube, ich habe bereits eine Entität in ein Modul importiert. Bitte werfen Sie einen Blick auf den aktualisierten Beitrag
Anton
1
Anton, wenn du das schon gelöst hast, dann poste deine Lösung bitte an SO.
Preston