Typ ORM w NESTJS - Nie można użyć instrukcji importu poza modułem

11

Rozpoczął nowy projekt za pomocą polecenia „nest new”. Działa dobrze, dopóki nie dodam do niego pliku encji.

Wystąpił następujący błąd:

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

^^^^^^

Błąd składni: nie można użyć instrukcji importu poza modułem

Za czym tęsknię

Dodawanie jednostki do modułu:

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
źródło
import {Moduł} z '@ nestjs / common';
Preston
@Preston chce wyjaśnić, co masz na myśli? Czy musisz utworzyć moduł dla często udostępnianych plików?
Joshua de Leon
Czy otrzymujesz błąd z lintera lub z kompilacji? Gdzie masz ten nowy plik? Czy to jest w twoim srckatalogu? Jeśli używasz TypeORM, można pokazać swój TypeOrmModuleimport w AppModule„s importstablicy? Może być coś nie tak z konfiguracją, której nie widzimy
Jay McDoniel,
zaktualizowany post z informacjami o imporcie encji
Anton

Odpowiedzi:

20

Zakładam, że masz TypeormModulekonfigurację z entitieswłaściwością, która wygląda następująco:

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

lub jak

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

Występujący błąd polega na tym, że próbujesz zaimportować tsplik w jskontekście. Tak długo, jak nie używasz webpacka, możesz użyć tego zamiast tego, aby uzyskać poprawne pliki

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

gdzie joinjest importowany z pathmodułu. Teraz __dirnamerozwiąże się srclub dist, a następnie znaleźć oczekiwany tslub jsplik odpowiednio. daj mi znać, jeśli nadal występuje problem.

EDYCJA 1/10/2020

Powyżej zakłada się, że konfiguracja jest zakończona, jest to plik zgodny z javascript ( .jslub TypeormModule.forRoot()przekazane parametry). Jeśli używasz ormconfig.jsonzamiast tego, powinieneś użyć

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

dzięki czemu używasz skompilowanych plików js i nie masz szans na użycie plików ts w kodzie.

Jay McDoniel
źródło
1
Ale to jest totalny bałagan. Maszynowy ORM, który nie akceptuje maszynopisu dla migracji ...
Madeo
denojest jedynym rodzimym programem uruchamiającym kod maszynowy. TypeORM, podczas gdy używa Typescript, nadal działa z Nodei środowiskiem wykonawczym JavaScript. Być może można wprowadzić ulepszenia, aby akceptować tspliki i kompilować je w JavaScript pod maską, a następnie usunąć je, aby użytkownik końcowy ich nie widział, ale to musiałoby zostać podniesione jako problem w repozytorium git TypeORM
Jay McDoniel
4

Jak wyjaśnił Jay McDoniel w swojej odpowiedzi, problemem wydaje się być dopasowanie wzorców plików encji w ormconfig.jsonpliku: prawdopodobnie plik maszynopisu (moduł) jest importowany z pliku javascript (prawdopodobnie wcześniej transpilowanego pliku maszynopisu).

Wystarczy usunąć istniejący tswzorzec ormconfig.jsonglobalny w , aby TypeORM ładował tylko pliki javascript. Ścieżka do plików encji powinna być względna do katalogu roboczego, w którym wykonywany jest węzeł.

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
iY1NQ
źródło
srcPrawdopodobnie powinien być zmieniony disttak, że tam kod uruchamialny jest po transpiled do javascript.
Jay McDoniel,
Dzięki, zaktualizowałem ścieżki.
iY1NQ
2

W dokumentacji TypeORM znalazłem konkretną sekcję dotyczącą maszynopisu .

Ta sekcja mówi:

Zainstaluj ts-node globalnie:

npm install -g ts-node

Dodaj komendę typeorm w sekcji skryptów w package.json

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

Następnie możesz uruchomić polecenie w następujący sposób:

npm run typeorm migration:run

Jeśli potrzebujesz przekazać parametr z myślnikiem do skryptu npm, musisz dodać go po -. Na przykład, jeśli chcesz wygenerować, polecenie wygląda następująco:

npm run typeorm migration:generate -- -n migrationNameHere

Działa to z moją konfiguracją pliku:

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

Następnie możesz uruchomić polecenie generowania.

Fabio Cortez
źródło
to powinna być zaakceptowana odpowiedź
Nico Li
1

Musisz mieć coś.module.ts dla każdej sekcji aplikacji. Działa jak Angular. Jest to konfigurowane przy pomocy resolwerów i usługi GraphQL REST jest nieco inny w przypadku kontrolera. Każdy moduł prawdopodobnie będzie miał jednostkę, a jeśli 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
źródło
Świetny. Czy to oznacza, że ​​kiedykolwiek możesz mieć jednostkę podstawową współużytkowaną przez wiele modułów, czy też ta jednostka podstawowa musiałaby być częścią wspólnego modułu?
Joshua de Leon
Prawdopodobnie jak Angular, ale nigdy tego nie próbowałem.
Preston
Jeśli to zadziała, zaznacz to jako odpowiedź.
Preston
Myślę, że już zaimportowałem jednostkę do modułu. Proszę spojrzeć na zaktualizowany post
Anton
1
Anton, jeśli już to rozwiązałeś, prześlij swoje rozwiązanie do SO.
Preston