ค้นหาเว็บไซต์

node.js - Nest ไม่สามารถแก้ไข DataSource ในฐานะการพึ่งพาได้


ฉันมีปัญหาเกี่ยวกับ dependencies ใน NestJS เมื่อเปิดแอป NestJS ของฉัน ตัวคอมไพเลอร์ก็แสดงข้อความนี้:

[Nest] 16004  - 09.04.2022, 16:14:46   ERROR [ExceptionHandler] Nest can't resolve dependencies of the AccountService (MailingService, ?). Please make sure that the argument DataSource at index [1] is available in the AccountModule context.

มีใครบอกฉันได้ไหมว่าฉันทำผิดตรงไหน?

นี่คือโมดูลของฉัน:

@Module({
  imports: [],
  providers: [AccountService, MailingService],
  controllers: [AccountController],
  exports: []
})
export class AccountModule {}

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
  ],
})
export class DatabaseModule {}

@Module({
  imports: [
    DatabaseModule,
    ConfigModule.forRoot({
      envFilePath: '.env',
    }),
    ScheduleModule.forRoot(),
    AccountModule,
    AuthModule,
    MailingModule],
  controllers: [AppController],
  providers: [],
})
export class AppModule { }

ขอบคุณสำหรับความช่วยเหลือทุกอย่าง!

ป.ล. DataSource เป็นคลาสจาก TypeORM ใช้สำหรับสร้างคำสั่งค้นหา ก่อนหน้านี้มันคือคลาส Connection

คำตอบ #1

ขั้นตอนแรกที่เราต้องทำคือการสร้างผู้ให้บริการฐานข้อมูล

database.providers.ts

import { DataSource } from 'typeorm';

export const databaseProviders = [
    {
        provide: DataSource,
        useFactory: async () => {
            // You can inject config service to provide dynamic DataSourceOptions
            const dataSource = new DataSource({
                type: 'mysql',
                host: 'localhost',
                port: 3306,
                username: 'root',
                password: 'root',
                database: 'test',
                entities: [
                    __dirname + '/../**/*.entity{.ts,.js}',
                ],
                synchronize: true,
            });
            try {
                if (!dataSource.isInitialized) {
                    await dataSource.initialize();
                }
            } catch (error) {
                console.error(error?.message);
            }
            return dataSource;
        }
    }
];

ตอนนี้เราสามารถนำเข้า/ส่งออกผู้ให้บริการฐานข้อมูลของเราใน DatabaseModule ได้แล้ว

ฐานข้อมูล module.ts

import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';

@Module({
    providers: [...databaseProviders],
    exports: [...databaseProviders],
})
export class DatabaseModule {}

ตอนนี้ เราสามารถฉีดพึ่งพา DataSouce เข้าไปในโมดูลฟีเจอร์ใดก็ได้ เช่น photo.module.ts

หมายเหตุ: อย่าลืมนำเข้า DatabaseModule ภายใน PhotoModule

คำตอบ #2

เอกสารไม่ได้ชัดเจนมากเกี่ยวกับเรื่องนี้ แต่ฉันก็พบว่าคุณสามารถใช้ตัวตกแต่ง @InjectDataSource() จากแพ็กเกจ @nest/typeorm ได้

ตัวอย่าง :

import { DataSource } from 'typeorm';
import { InjectDataSource } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forRoot(), UsersModule],
})
export class AppModule {
  constructor(
    @InjectDataSource()
    private dataSource: DataSource
  ) {}
}

บทความที่เกี่ยวข้อง