TypeORM Entity ใน NESTJS - ไม่สามารถใช้คำสั่งนำเข้านอกโมดูล


11

เริ่มต้นโครงการใหม่ด้วยคำสั่ง 'nest new' ทำงานได้ดีจนกว่าฉันจะเพิ่มไฟล์เอนทิตีลงไป

มีข้อผิดพลาดดังต่อไปนี้:

นำเข้า {Entity, คอลัมน์, 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 {}

นำเข้า {Module} จาก '@ nestjs / common';
เพรสตัน

@Preston สนใจที่จะทำอย่างละเอียดในสิ่งที่คุณหมายถึงอะไร? คุณต้องสร้างโมดูลสำหรับไฟล์ที่แชร์ทั่วไปหรือไม่?
Joshua de Leon

คุณได้รับข้อผิดพลาดจาก linter ของคุณหรือจากการรวบรวม? คุณมีไฟล์ใหม่นี้อยู่ที่ไหน อยู่ในsrcไดเรกทอรีของคุณหรือไม่ หากคุณกำลังใช้ TypeORM คุณสามารถแสดงของคุณTypeOrmModuleนำเข้าในAppModule's importsอาร์เรย์? อาจมีบางอย่างผิดปกติกับการกำหนดค่าที่เรามองไม่เห็น
Jay McDoniel

โพสต์ที่ได้รับการอัปเดตพร้อมข้อมูลการนำเข้าเอนทิตี
Anton

คำตอบ:


20

สมมติฐานของฉันคือคุณมีการTypeormModuleกำหนดค่าด้วยentitiesคุณสมบัติที่มีลักษณะเช่นนี้:

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

หรือชอบ

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

ข้อผิดพลาดที่คุณได้รับคือเนื่องจากคุณพยายามที่จะนำเข้าtsไฟล์ในjsบริบท ตราบใดที่คุณไม่ได้ใช้ webpack คุณสามารถใช้สิ่งนี้แทนเพื่อให้คุณได้รับไฟล์ที่ถูกต้อง

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

ที่joinนำเข้าจากpathโมดูล ตอนนี้__dirnameจะแก้ไขsrcหรือdistค้นหาไฟล์ที่คาดหวังtsหรือjsตามลำดับ แจ้งให้เราทราบหากยังมีปัญหาเกิดขึ้น

แก้ไข 1/10/2020

ด้านบนถือว่าการตั้งค่าเสร็จแล้วเป็นไฟล์ที่รองรับจาวาสคริปต์ ( .jsหรือในTypeormModule.forRoot()พารามิเตอร์ที่ส่งผ่าน) หากคุณกำลังใช้ormconfig.jsonแทนคุณควรใช้

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

เพื่อให้คุณใช้ไฟล์ js ที่คอมไพล์แล้วและไม่มีโอกาสใช้ไฟล์ ts ในโค้ดของคุณ


1
แต่นี่เป็นระเบียบทั้งหมด typescript ORM ที่ไม่ยอมรับ typescript สำหรับการโอนย้าย ...
Madeo

denoเป็นนักวิ่งโค้ดตัวพิมพ์พื้นเมืองเท่านั้น TypeORMในขณะที่มันใช้ typescript ยังคงทำงานร่วมกับNodeและรันไทม์ JavaScript อาจมีการปรับปรุงให้สามารถยอมรับtsไฟล์และคอมไพล์ไฟล์เหล่านั้นลงใน JavaScript ภายใต้ประทุนได้จากนั้นลบออกเพื่อให้ผู้ใช้ไม่เห็นพวกเขา แต่จะต้องนำมาเป็นปัญหาในพื้นที่เก็บข้อมูล git TypeORM
Jay McDoniel

4

ดังที่ Jay McDoniel อธิบายไว้ในคำตอบของเขาปัญหาดูเหมือนว่าจะเป็นการจับคู่รูปแบบของไฟล์เอนทิตีในormconfig.jsonไฟล์: อาจเป็นไฟล์ typescript (โมดูล) ที่นำเข้าจากไฟล์ javascript (อาจเป็นไฟล์ typescript transpiled ก่อนหน้านี้)

มันควรจะเพียงพอที่จะลบtsรูปแบบ glob ที่มีอยู่ในormconfig.jsonดังนั้น TypeORM จะโหลดไฟล์จาวาสคริปต์เท่านั้น พา ธ ไปยังไฟล์เอนทิตีควรสัมพันธ์กับไดเร็กตอรี่การทำงานที่โหนดทำงาน

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

srcควรอาจจะเปลี่ยนไปdistเป็นที่ที่รหัส Runnable คือหลังจากที่ถูก transpiled เพื่อจาวาสคริปต์
Jay McDoniel

ขอบคุณฉันอัพเดทเส้นทาง
iY1NQ

2

ในเอกสาร TypeORM ผมพบว่าส่วนที่เฉพาะเจาะจงสำหรับtypescript

ส่วนนี้พูดว่า:

ติดตั้ง ts-node ทั่วโลก:

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

จากนั้นคุณสามารถเรียกใช้คำสั่งสร้าง


นี่ควรเป็นคำตอบที่ยอมรับ
Nico Li

1

คุณต้องมีบางสิ่งบางอย่างโมดูลสำหรับทุกส่วนของแอปของคุณ มันทำงานเหมือนเชิงมุม นี่คือการตั้งค่าด้วยตัวแก้ไขและบริการ GraphQL REST นั้นแตกต่างกันเล็กน้อยกับคอนโทรลเลอร์ แต่ละโมดูลอาจมีเอนทิตีและถ้า 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 {}

ยอดเยี่ยม นั่นหมายความว่าคุณจะสามารถแชร์เอนทิตีฐานข้ามหลายโมดูลหรือเอนทิตีฐานนั้นจะต้องเป็นส่วนหนึ่งของโมดูลประเภทสามัญได้หรือไม่?
Joshua de Leon

อาจเป็นเช่นเดียวกับเชิงมุม แต่ไม่เคยลอง
เพรสตัน

หากได้ผลโปรดทำเครื่องหมายเป็นคำตอบ
เปรสตัน

ฉันคิดว่าฉันได้นำเข้าเอนทิตีไปยังโมดูลแล้ว โปรดดูโพสต์ที่อัปเดตแล้ว
Anton

1
แอนตันหากคุณแก้ไขปัญหานี้แล้วโปรดโพสต์โซลูชันของคุณไปที่ SO
เพรสตัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.