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