我正在使用Nestjs框架来开发我的Elastic Service应用程序。 我在代码中使用“ @ nestjs / elasticsearch”库,而我只是在尝试建立数据库连接并在所有其他模块中使用。请在这里找到我的代码示例。
我的应用程序模块显示在下面
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from './config/config.module';
import { DatabaseModule } from './database/database.module';
import { LayoutmgmtModule } from './layoutmgmt/layoutmgmt.module';
@Module({
imports: [ConfigModule,DatabaseModule, LayoutmgmtModule],
controllers: [AppController],
providers: [AppService]
})
export class AppModule {}
我的数据库模块是
import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
import {ConfigModule} from '../config/config.module';
import {ConfigService} from '../config/config.service';
import {DatabaseService} from './database.service';
@Module({
imports:[ElasticsearchModule.registerAsync({
imports:[ConfigModule],
useFactory: async (configService: ConfigService) => ({
host: configService.get('ELASTIC_URL'),
log: 'trace',
requestTimeout: 3000
}),
inject:[ConfigService]
})],
providers:[DatabaseService],
})
export class DatabaseModule {}
我的数据库服务是
import { Injectable,HttpException } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
import { Client } from 'elasticsearch';
@Injectable()
export class DatabaseService {
private readonly esClient:Client;
constructor(private readonly elasticsearchService: ElasticsearchService) {
try {
this.esClient = elasticsearchService.getClient();
this.esClient.ping({ requestTimeout: 3000 },function(err,res,status){
if (err || !(res)) {
console.log('Unable to connect to the server. Please start the server. Error:', err);
throw new HttpException({
status: 'error',
message: 'Unable to connect to the server. Please start the server. Error:'
}, 500);
} else {
console.log('Connected to Server successfully!',res, status);
}
});
}
catch(err) {
console.log('Error in connection' + err);
throw new HttpException({
status: 'error',
message: 'Unable to reach Elasticsearch cluster'
}, 500);
}
}
}
现在在上面,我已经初始化了连接,并且可以毫无问题地连接到数据库,但是我试图在另一个名为layout module的模块/服务中重用ElasticsearchService
布局模块如下
import { Module } from '@nestjs/common';
import { LayoutmgmtController } from './layoutmgmt.controller';
import { LayoutmgmtService } from './layoutmgmt.service';
@Module({
controllers: [LayoutmgmtController],
providers: [LayoutmgmtService],
})
export class LayoutmgmtModule {}
布局服务如下
import { Inject, Injectable, Dependencies } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
import { Client } from 'elasticsearch';
@Injectable()
export class LayoutmgmtService {
private readonly esClient:Client;
constructor(@Inject(ElasticsearchService) private readonly elasticsearchService: ElasticsearchService) {
this.esClient = elasticsearchService.getClient();
if (!this.esClient){
console.log("Elastic alreayd connected")
}
}
}
如果我在构造函数内部的上述服务中使用ElasticSErachService,则出现以下错误,我想重用现有的连接..
[嵌套] 10724-10/14/2019,4:50:41 PM [ExceptionHandler] Nest无法解析LayoutmgmtService(?)的依赖项。请确保在索引[0]处的参数在LayoutmgmtModule上下文中可用。 +40毫秒 错误:Nest无法解析LayoutmgmtService(?)的依赖项。请确保在索引[0]处的参数在LayoutmgmtModule上下文中可用。 在Injector.lookupComponentInExports(C:\ Subu \ Elastic \ elastic-nest-js \ node_modules @ nestjs \ core \ injector \ injector.js:183:19) 在process._tickCallback(内部/进程/next_tick.js:68:7) 在Function.Module.runMain(内部/模块/cjs/loader.js:744:11) 在对象。 (C:\ Subu \ Elastic \ elastic-nest-js \ node_modules \ ts-node \ src \ bin.ts:158:12) 在Module._compile(内部/模块/cjs/loader.js:688:30) 在Object.Module._extensions..js(内部/模块/cjs/loader.js:699:10) 在Module.load(internal / modules / cjs / loader.js:598:32) 在tryModuleLoad(内部/模块/cjs/loader.js:537:12) 在Function.Module._load(internal / modules / cjs / loader.js:529:3) 在Function.Module.runMain(internal / modules / cjs / loader.js:741:12)
答案 0 :(得分:0)
您没有在任何地方导出ElasticsearchService
。也许您的DatabaseModule
应该与DatabaseService
一起导出(LayoutmgmtService
应该使用其中任何一个)。
最重要的是,您应将给定的服务添加到providers
的{{1}}
答案 1 :(得分:0)
LayoutmgmtModule
和DatabaseModule
在您的代码中始终不相关。
您已经在ElasticsearchModule
中注册了DatabaseModule
,但没有在LayoutmgmtModule
中注册,因此它无法找到服务。
解决方案1
只需在LayoutmgmtModule
中添加LayoutmgmtController
和LayoutmgmtService
,就可以摆脱DataBaseModule
,它应该开始工作了
解决方案2
只需将DataBaseModule
前面提到的@Global()
装饰器前面添加@Module
到here