如何在 NestJS 中正确注入提供者?
How to properly inject provider in NestJS?
我创建了一个如下所示的 Firebase 提供程序(不使用带有导出和导入的模块文件):
@Injectable()
export class FirebaseProvider {
public app: admin.app.App;
constructor() {
this.app = admin.initializeApp(config);
}
}
并将此提供程序添加到 AppModule 中的 providers
:
providers: [AppService, FirestoreProvider, ClientService],
并在 ClientModule
中:
providers: [CustomersService, FirestoreProvider],
所以,现在我想在我的 ClientService
中使用这个提供程序,所以我通过构造函数注入这个提供程序,如下所示:
constructor(
private readonly firestoreProvider: FirestoreProvider,
) {}
现在我遇到了问题,有人能告诉我为什么 NestJs 多次向我注入这个提供者并且因为这个 firebase 抛出这个错误:
The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most cases you only need to call initializeApp() once. But if you do want to initialize multiple
apps, pass a second argument to initializeApp() to give each app a unique name.
我只在这个提供者中初始化这个firebase,那么如何在整个项目的服务中正确使用这个提供者?
感谢您的帮助!
我认为您不想在模块的 provider:[]
数组中多次声明 FirestoreProvider
。尝试这样的事情:
@Module({
imports: [
FirestoreModule
],
})
export class AppModule{}
现在您已经导入了 FirestoreModule
,您可以在这个 AppModule
中的任何 class 中使用它。示例:
@Injectable()
export class FooService {
constructor(private firestore: FirestoreProvider) {}
}
这里的关键是在自己的模块中定义您的提供者,然后通过 exports:[]
数组导出它,并通过该模块的 providers:[]
数组提供它。
import { FirestoreProvider } from './FirestoreProvider'
@Module({
providers: [ FirestoreProvider ],
exports: [ FirestoreProvider ],
})
export class FirestoreModule{}
@Injectable()
export class FirestoreProvider {
public app: admin.app.App;
constructor() {
this.app = admin.initializeApp(config);
}
}
我创建了一个如下所示的 Firebase 提供程序(不使用带有导出和导入的模块文件):
@Injectable()
export class FirebaseProvider {
public app: admin.app.App;
constructor() {
this.app = admin.initializeApp(config);
}
}
并将此提供程序添加到 AppModule 中的 providers
:
providers: [AppService, FirestoreProvider, ClientService],
并在 ClientModule
中:
providers: [CustomersService, FirestoreProvider],
所以,现在我想在我的 ClientService
中使用这个提供程序,所以我通过构造函数注入这个提供程序,如下所示:
constructor(
private readonly firestoreProvider: FirestoreProvider,
) {}
现在我遇到了问题,有人能告诉我为什么 NestJs 多次向我注入这个提供者并且因为这个 firebase 抛出这个错误:
The default Firebase app already exists. This means you called initializeApp() more than once without providing an app name as the second argument. In most cases you only need to call initializeApp() once. But if you do want to initialize multiple
apps, pass a second argument to initializeApp() to give each app a unique name.
我只在这个提供者中初始化这个firebase,那么如何在整个项目的服务中正确使用这个提供者?
感谢您的帮助!
我认为您不想在模块的 provider:[]
数组中多次声明 FirestoreProvider
。尝试这样的事情:
@Module({
imports: [
FirestoreModule
],
})
export class AppModule{}
现在您已经导入了 FirestoreModule
,您可以在这个 AppModule
中的任何 class 中使用它。示例:
@Injectable()
export class FooService {
constructor(private firestore: FirestoreProvider) {}
}
这里的关键是在自己的模块中定义您的提供者,然后通过 exports:[]
数组导出它,并通过该模块的 providers:[]
数组提供它。
import { FirestoreProvider } from './FirestoreProvider'
@Module({
providers: [ FirestoreProvider ],
exports: [ FirestoreProvider ],
})
export class FirestoreModule{}
@Injectable()
export class FirestoreProvider {
public app: admin.app.App;
constructor() {
this.app = admin.initializeApp(config);
}
}