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.