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

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.


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"
   ],

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.


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

Ś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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.