Entity TypeORM в NESTJS - Неможливо використовувати оператор імпорту поза модулем


11

Розпочали новий проект командою 'gnest new'. Відмінно працює, поки я не додаю до нього файл сутності.

Отримала таку помилку:

імпорт {Entity, Column, PrimaryGeneratedColumn} з 'typeorm';

^^^^^^

SyntaxError: Неможливо використовувати оператор імпорту поза модулем

Що я сумую?

Додавання сутності до модуля:

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

імпортувати {Модуль} з '@ nestjs / common';
Престон

@Preston піклуватися про те, щоб розібратися в тому, що ви маєте на увазі? Чи потрібно створити модуль для спільно використовуваних файлів?
Джошуа де Леон

Чи отримуєте ви помилку зі свого лайнера або з компіляції? Звідки у вас новий файл? Це у вашому srcкаталозі? Якщо ви використовуєте TypeORM, ви можете показати свій TypeOrmModuleімпорт в AppModule«s importsмасив? З конфігурацією, яку ми не бачимо, може статися щось не так
Jay McDoniel

оновлений пост із інформацією про імпорт юридичної особи
Антон

Відповіді:


20

Моє припущення, що у вас є TypeormModuleконфігурація з entitiesвластивістю, яка виглядає приблизно так:

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

чи як

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

Помилка, яку ви отримуєте, полягає в тому, що ви намагаєтеся імпортувати tsфайл у jsконтексті. Поки ви не використовуєте веб-пакет, ви можете використовувати це замість цього, щоб отримати правильні файли

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

куди joinімпортується з pathмодуля. Тепер __dirnameбуде вирішено srcабо, distа потім знайти очікуване tsабо jsфайл відповідно. дайте мені знати, чи все ще виникає проблема.

РЕДАКЦІЯ 1.10.2020

Вищенаведене передбачає, що конфігурація виконана файлом, сумісним з javascript ( .jsабо в TypeormModule.forRoot()переданих параметрах). Якщо ви ormconfig.jsonзамість цього використовуєте, вам слід скористатися

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

так що ви використовуєте компільовані файли js і не маєте шансів використовувати файли ts у своєму коді.


1
Але це тотальний безлад. Машина машинопису ORM, яка не приймає машинопис для міграцій ...
Мадео

denoє єдиним носієм коду машинопису. TypeORM, хоча він використовує Typescript, він все ще працює з NodeJavaScript і час його виконання. Можливо, можна вдосконалити прийняття tsфайлів та їх компіляцію в JavaScript під кришкою, а потім видалити їх, щоб кінцевий користувач не бачив їх, але це потрібно було б вирішити як проблему в сховищі git TypeORM
Jay McDoniel

4

Як пояснив у своїй відповіді Джей Макдоніел, схоже, проблема полягає у відповідності шаблону файлів сутності у ormconfig.jsonфайлі: ймовірно, файл (модуль) машинопису імпортується з файлу javascript (імовірно, раніше перекладеного файлу машинопису).

Потрібно достатньо для видалення наявного tsглобального шаблону в ormconfig.json, щоб TypeORM завантажував лише файли javascript. Шлях до файлів сутності повинен бути відносно робочого каталогу, де виконується вузол.

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

src, Ймовірно , слід змінити , щоб , distяк це де працездатний код після того , як transpiled в JavaScript.
Джей МакДоніел

Дякую, я оновила стежки.
iY1NQ

2

У документації TypeORM я знайшов специфічний розділ для Typescript .

У цьому розділі сказано:

Встановіть ts-вузол у всьому світі:

npm install -g ts-node

Додайте команду typeorm у розділ сценаріїв у package.json

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

Тоді ви можете виконати команду так:

npm run typeorm migration:run

Якщо вам потрібно передати параметр з тире до npm скрипту, вам потрібно буде додати їх після -. Наприклад, якщо вам потрібно створити, команда виглядає так:

npm run typeorm migration:generate -- -n migrationNameHere

Це працює з конфігурацією мого файлу:

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

Тоді ви можете запустити команду generating.


це має бути прийнята відповідь
Ніко Лі

1

Потрібно мати щось.module.ts для кожного розділу програми. Це працює як Angular. Це налаштування за допомогою GraphQL-розв’язувачів та сервісу. REST трохи відрізняється від контролера. Кожен модуль, ймовірно, матиме сутність і якщо GraphQL, Проекти.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 {}

Відмінно. Отже, це означає, що ви можете коли-небудь мати базову сутність, поділену на декілька модулів, або це базове утворення повинно бути частиною загального модуля?
Джошуа де Леон

Напевно, як Angular, але ніколи цього не пробував.
Престон

Якщо це працює, позначте його як відповідь.
Престон

Я думаю, я вже імпортував об'єкт до модуля. Перегляньте оновлений пост
Антон

1
Антоне, якщо ти вже вирішив це, то, будь ласка, опублікуй своє рішення на ТА.
Престон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.