我想在我的 Nest.js 应用程序中创建基于配置模块的 MQTT 连接。我正在使用非常旧的 npm 包:https://github.com/microud/nest-mqtt。我更新了必要的依赖项,现在我尝试使用它。但是我遇到了这个问题:
Error: Nest cant resolve dependencies of the MQTT_OPTION_PROVIDER (?). Please make sure that the argument ConfigurationService at index [0] is available in the MqttModule context.
这是我的 app.module 的外观:
@Module({
imports: [ConfigurationModule, MySQLModule, MQTTModule],
controllers: [],
providers: [],
})
export class AppModule {}
config.module.ts
@Module({
imports: [ConfigModule.forRoot()],
providers: [ConfigurationService],
exports: [ConfigurationService],
})
export class ConfigurationModule {}
mqtt.module.ts
const MqttGlobalConnection = MqttModule.forRootAsync({
useFactory: (config: ConfigurationService) => ({
logger: {
useValue: new CustomLogger('MQTT'),
},
...config.MQTT_GLOBAL_CONNECTION,
}),
inject: [ConfigurationService],
imports: [ConfigurationModule],
});
@Module({
imports: [ConfigurationModule, MqttGlobalConnection],
})
export class MQTTModule {}
这个非常简单的配置是否有问题,或者错误出在 Nest-mqtt 库中。
PS 当我将 forRootAsync 更改为 forRoot 时,一切似乎都正常,但在我看来看起来有点糟糕:
const MqttGlobalConnection = MqttModule.forRoot({
logger: { useValue: new CustomLogger('MQTT') },
...new ConfigurationService(new ConfigService()).MQTT_GLOBAL_CONNECTION,
});
问题出在包装本身。我将它与我正在使用的其他软件包进行了比较,并发现了一些东西。在 forRootAsync 方法的包内,缺少“import”行。
public static forRootAsync(options: MqttModuleAsyncOptions): DynamicModule {
return {
module: MqttModule,
providers: [
...createOptionProviders(options),
createLoggerProvider(options),
createClientProvider(),
MqttExplorer,
MqttService,
],
imports: options.imports || [],
};
}
一旦我添加了它,一切就开始正常工作了。