Thực thể TypeORM trong NESTJS - Không thể sử dụng câu lệnh nhập bên ngoài mô-đun


11

Bắt đầu dự án mới với lệnh 'lồng mới'. Hoạt động tốt cho đến khi tôi thêm tập tin thực thể vào nó.

Có lỗi sau:

nhập {Thực thể, Cột, ChínhGeneratedColumn} từ 'typeorm';

^ ^ ^ ^ ^ ^ ^

Cú pháp: Không thể sử dụng câu lệnh nhập bên ngoài mô-đun

Tôi nhớ cái gì

Thêm thực thể vào mô-đun:

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

nhập {Module} từ '@ Nestjs / common';
Preston

@Preston quan tâm để giải thích những gì bạn có ý nghĩa? Bạn có phải tạo một mô-đun cho các tệp thường được chia sẻ?
Joshua de Leon

Bạn đang nhận được lỗi từ kẻ nói dối của bạn hoặc từ một trình biên dịch? Nơi nào bạn có tập tin mới này? Có phải trong srcthư mục của bạn ? Nếu bạn đang sử dụng TypeORM, bạn có thể hiển thị của bạn TypeOrmModulenhập khẩu trong AppModulecủa importsmảng? Có thể có điều gì đó không đúng với cấu hình mà chúng ta không thể thấy
Jay McDoniel 23/12/19

bài đăng được cập nhật với thông tin nhập thực thể
Anton

Câu trả lời:


20

Giả định của tôi là bạn có một TypeormModulecấu hình với một thuộc entitiestính trông như thế này:

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

hoặc thích

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

Lỗi bạn gặp phải là do bạn đang cố nhập tstệp trong jsngữ cảnh. Miễn là bạn không sử dụng webpack, bạn có thể sử dụng cái này thay vào đó để bạn có được các tệp chính xác

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

nơi joinđược nhập từ pathmô-đun. Bây giờ __dirnamesẽ giải quyết srchoặc distsau đó tìm dự kiến tshoặc jstệp tương ứng. cho tôi biết nếu vẫn còn một vấn đề đang xảy ra

EDIT 1/10/2020

Giả định ở trên cấu hình được thực hiện là một tệp tương thích javascript ( .jshoặc trong các TypeormModule.forRoot()tham số đã truyền). Nếu bạn đang sử dụng ormconfig.jsonthay thế, bạn nên sử dụng

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

do đó bạn đang sử dụng các tệp js đã biên dịch và không có cơ hội sử dụng các tệp ts trong mã của mình.


1
Nhưng đây là một mớ hỗn độn. Một ORM bản thảo không chấp nhận bản in cho việc di chuyển ...
Madeo

denolà người chạy mã bản in duy nhất. TypeORM, trong khi nó sử dụng Bản mô tả, vẫn hoạt động với Nodevà thời gian chạy JavaScript. Có thể các cải tiến có thể được thực hiện để chấp nhận tscác tệp và biên dịch chúng thành JavaScript dưới mui xe, sau đó xóa chúng để người dùng cuối không nhìn thấy chúng, nhưng điều đó sẽ được đưa ra như một vấn đề trên kho lưu trữ
TypeORM

4

Như Jay McDoniel đã giải thích trong câu trả lời của mình, vấn đề dường như là khớp mẫu của các tệp thực thể trong ormconfig.jsontệp: Có thể là tệp bản thảo (mô-đun) được nhập từ tệp javascript (có thể là tệp bản thảo được sao chép trước đó).

Nó là đủ để loại bỏ một tsmẫu toàn cầu hiện có trong ormconfig.json, do đó TypeORM sẽ chỉ tải các tệp javascript. Đường dẫn đến các tệp thực thể phải liên quan đến thư mục làm việc nơi nút được thực thi.

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

srclẽ nên thay đổi thành distmã có thể chạy được sau khi được dịch sang javascript.
Jay McDoniel

Cảm ơn, tôi đã cập nhật các đường dẫn.
iY1NQ

2

Trong tài liệu hướng dẫn TypeORM, tôi tìm thấy một phần cụ thể đối với nguyên cảo .

Phần này nói:

Cài đặt nút ts trên toàn cầu:

npm install -g ts-node

Thêm lệnh typeorm dưới phần script trong pack.json

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

Sau đó, bạn có thể chạy lệnh như thế này:

npm run typeorm migration:run

Nếu bạn cần chuyển tham số với tập lệnh dash sang npm, bạn sẽ cần thêm chúng sau -. Ví dụ: nếu bạn cần tạo, lệnh sẽ như sau:

npm run typeorm migration:generate -- -n migrationNameHere

Điều này hoạt động với cấu hình tập tin của tôi:

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

Sau đó, bạn có thể chạy lệnh tạo.


đây sẽ là câu trả lời được chấp nhận
Nico Li

1

Bạn cần phải có một cái gì đó.module.ts cho mỗi phần trong ứng dụng của bạn. Nó hoạt động như Angular. Đây là thiết lập với các trình phân giải và dịch vụ GraphQL. REST có một chút khác biệt với bộ điều khiển. Mỗi mô-đun có thể sẽ có một thực thể và nếu GraphQL, dự án.schema.graphql.

dự án.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 {}

Thông minh. Vì vậy, điều đó có nghĩa là bạn có thể có một thực thể cơ sở được chia sẻ trên nhiều mô-đun hay thực thể cơ sở đó phải là một phần của mô-đun commons?
Joshua de Leon

Có lẽ, giống như Angular, nhưng không bao giờ thử nó.
Preston

Nếu điều này hoạt động xin vui lòng đánh dấu nó là câu trả lời.
Preston

Tôi nghĩ rằng tôi đã nhập thực thể vào mô-đun. Xin hãy xem bài đăng cập nhật
Anton

1
Anton, nếu bạn đã giải quyết điều này rồi thì hãy đăng giải pháp của bạn lên SO.
Preston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.