NESTJS में टाइप एंटिटी - एक मॉड्यूल के बाहर आयात विवरण का उपयोग नहीं कर सकता


11

'नेस्ट न्यू' कमांड के साथ नई परियोजना शुरू की। जब तक मैं इसमें इकाई फ़ाइल नहीं जोड़ता तब तक ठीक काम करता है।

निम्नलिखित त्रुटि मिली:

आयात {Entity, Column, PrimaryGeneratedColumn} 'टाइपॉर्म ’से;

^^^^^^

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 / आम' से {मॉड्यूल} आयात करें;
प्रेस्टन

@ प्रेस्टन की देखभाल का क्या मतलब है? क्या आपको सामान्य रूप से साझा की गई फ़ाइलों के लिए एक मॉड्यूल बनाना है?
जोशुआ डे लियोन

क्या आप अपने लिंटर से या एक संकलन से त्रुटि प्राप्त कर रहे हैं? आपके पास यह नई फ़ाइल कहां है? क्या यह आपकी srcनिर्देशिका में है? आप TypeORM का उपयोग कर रहे हैं, तो आप अपने को दिखा सकते हैं TypeOrmModuleमें आयात AppModuleकी 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फ़ाइल ढूंढेगा। मुझे बताएं कि क्या अभी भी कोई मुद्दा चल रहा है।

EDIT 1/10/2020

ऊपर माना जाता है कि विन्यास किया जाता है एक जावास्क्रिप्ट संगत फ़ाइल ( .jsया TypeormModule.forRoot()पारित मापदंडों में)। यदि आप ormconfig.jsonइसके बजाय उपयोग कर रहे हैं , तो आपको उपयोग करना चाहिए

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

ताकि आप संकलित js फ़ाइलों का उपयोग कर रहे हैं और आपके कोड में ts फ़ाइलों का उपयोग करने का कोई मौका नहीं है।


1
लेकिन यह कुल गड़बड़ है। एक टाइपस्क्रिप्ट ORM जो माइग्रेशन के लिए टाइपस्क्रिप्ट स्वीकार नहीं करता है ...
मेडो

denoकेवल मूल टाइपस्क्रिप्ट कोड रनर है। TypeORM, जबकि यह टाइपस्क्रिप्ट का उपयोग करता है, फिर भी Nodeजावास्क्रिप्ट रनटाइम के साथ काम करता है। हो सकता है कि सुधार स्वीकार करने के लिए बनाया जा सकता है tsफ़ाइलों और उन्हें हुड के नीचे जावास्क्रिप्ट में संकलित है, तो उन्हें हटा दें तो अंत उपयोगकर्ता उन्हें देख नहीं है, लेकिन है कि TypeORM Git भंडार पर एक मुद्दे के रूप में लाया जा करने की आवश्यकता होगी
जे McDoniel

4

जैसा कि जे मैकडॉनियल ने अपने जवाब में बताया, समस्या ormconfig.jsonफ़ाइल में इकाई फ़ाइलों के पैटर्न मिलान से प्रतीत होती है : संभवतः एक टाइपस्क्रिप्ट फ़ाइल (मॉड्यूल) एक जावास्क्रिप्ट फ़ाइल से आयात की जाती है (संभवतः एक पहले से ट्रांस टाइप की गई फ़ाइल)।

इसमें मौजूदा tsग्लोब पैटर्न को हटाने के लिए पर्याप्त होना चाहिए ormconfig.json, ताकि टाइप करेंम केवल जावास्क्रिप्ट फ़ाइलों को लोड करेगा। इकाई फ़ाइलों का पथ कार्यशील निर्देशिका के सापेक्ष होना चाहिए जहां नोड निष्पादित होता है।

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

srcशायद करने के लिए बदल दिया जाना चाहिए distकि के रूप में जहां runnable कोड जावास्क्रिप्ट को transpiled किए जाने के बाद है।
जे मैकडॉनियल

धन्यवाद, मैंने रास्तों को अपडेट किया।
iY1NQ

2

टाइप करें प्रलेखन में, मैंने टाइपस्क्रिप्ट के लिए एक विशिष्ट अनुभाग पाया

यह खंड कहता है:

विश्व स्तर पर टीएस-नोड स्थापित करें:

npm install -g ts-node

Package.json में स्क्रिप्ट सेक्शन के तहत टाइपॉर्म कमांड जोड़ें

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

तो आप इस तरह से कमांड चला सकते हैं:

npm run typeorm migration:run

यदि आपको एनपीएम स्क्रिप्ट के लिए डैश के साथ पैरामीटर पास करने की आवश्यकता है, तो आपको उन्हें बाद में जोड़ना होगा -। उदाहरण के लिए, यदि आपको उत्पन्न करने की आवश्यकता है, तो कमांड इस तरह है:

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

फिर आप जनरेट कमांड चला सकते हैं।


यह स्वीकृत उत्तर होना चाहिए
निको ली

1

आपके पास अपने ऐप के हर सेक्शन के लिए कुछ.module.ts होना चाहिए। यह कोणीय की तरह काम करता है। यह ग्राफकॉल रिसोल्वर और सर्विस के साथ सेटअप है। नियंत्रक के साथ REST थोड़ा अलग है। प्रत्येक मॉड्यूल में संभवतः एक इकाई होगी और अगर ग्राफक्यूएल, प्रोजेक्ट्स .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 {}

अति उत्कृष्ट। तो क्या इसका मतलब है कि आप कभी भी एक आधार इकाई को कई मॉड्यूल में साझा कर सकते हैं या उस आधार इकाई को किसी प्रकार के कॉमन्स मॉड्यूल का हिस्सा बनना होगा?
जोशुआ डे लियोन

शायद, कोणीय की तरह, लेकिन कभी कोशिश नहीं की।
प्रेस्टन

यदि यह काम करता है तो कृपया इसे उत्तर के रूप में चिह्नित करें।
प्रेस्टन

मुझे लगता है कि मैं मॉड्यूल के लिए पहले से ही आयातित इकाई है। कृपया अद्यतन पोस्ट पर एक नज़र डालें
एंटोन

1
एंटोन, अगर आपने पहले ही इसका समाधान कर लिया है तो कृपया अपना समाधान एसओ को पोस्ट करें।
प्रेस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.