Nest无法解析searchService(?)的依赖项。请确保索引处的参数

时间:2019-10-14 20:54:39

标签: nestjs

我正在使用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)

2 个答案:

答案 0 :(得分:0)

您没有在任何地方导出ElasticsearchService。也许您的DatabaseModule应该与DatabaseService一起导出(LayoutmgmtService应该使用其中任何一个)。 最重要的是,您应将给定的服务添加到providers的{​​{1}}

答案 1 :(得分:0)

LayoutmgmtModuleDatabaseModule在您的代码中始终不相关。 您已经在ElasticsearchModule中注册了DatabaseModule,但没有在LayoutmgmtModule中注册,因此它无法找到服务。

解决方案1 ​​

只需在LayoutmgmtModule中添加LayoutmgmtControllerLayoutmgmtService,就可以摆脱DataBaseModule,它应该开始工作了

解决方案2

只需将DataBaseModule前面提到的@Global()装饰器前面添加@Modulehere