Nest не может разрешить зависимости searchService (?). Пожалуйста, убедитесь, что аргумент в индексе - PullRequest
0 голосов
/ 14 октября 2019

Я использую инфраструктуру Nestjs для разработки своего приложения Elastic Service. Я использую библиотеку '@ nestjs /asticsearch' внутри своего кода, и я просто пытаюсь установить соединение с базой данных и использовать внутри всех других модулей. Пожалуйста, найдите мой пример кода здесь.

Мой модуль приложения выглядит ниже

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

}

Теперь выше я без проблем инициализировал соединение и его подключение к базе данных, но я пытаюсь повторно использовать 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 в службе выше в конструкторе, я получаю приведенную ниже ошибку, я хочу повторно использовать существующее соединение ..

[Nest] 10724 - 14.10.2015, 16:50:41 [ExceptionHandler] Nest не может разрешить зависимости LayoutmgmtService (?). Пожалуйста, убедитесь, что аргумент в index [0] доступен в контексте LayoutmgmtModule. + 40 мс Ошибка: Nest не может разрешить зависимости LayoutmgmtService (?). Пожалуйста, убедитесь, что аргумент в index [0] доступен в контексте LayoutmgmtModule. в Injector.lookupComponentInExports (C: \ Subu \ Elastic \astic-nest-js \ node_modules @ nestjs \ core \ injector \ injector.js: 183: 19) в process._tickCallback (внутренний / process / next_tick.js: 68: 7) в Function.Module.runMain (внутренняя / modules / cjs / loader.js: 744: 11) в объекте. (C: \ Subu \ Elastic \astic-nest-js \ node_modules \ ts-node \ src \ bin.ts: 158: 12) в Module._compile (внутренний / modules / cjs / loader.js: 688: 30) вObject.Module._extensions..js (внутренние / modules / cjs / loader.js: 699: 10) в Module.load (внутренние / modules / cjs / loader.js: 598: 32) в tryModuleLoad (внутренние / modules / cjs)/loader.js:537:12) в Function.Module._load (внутренний / modules / cjs / loader.js: 529: 3) в Function.Module.runMain (внутренний / modules / cjs / loader.js: 741: 12)

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

LayoutmgmtModule и DatabaseModule никак не связаны в вашем коде. Вы зарегистрировали ElasticsearchModule в DatabaseModule, но не в LayoutmgmtModule, поэтому не можете найти услугу.

Решение 1

Вы можете избавитьсяLayoutmgmtModule, просто добавив LayoutmgmtController и LayoutmgmtService в DataBaseModule, и он должен начать работать

Решение 2

Вы можете сделать DataBaseModuleкак глобальный, просто добавив @Global() перед @Module декоратором, как упомянуто здесь

0 голосов
/ 15 октября 2019

Вы нигде не экспортируете ElasticsearchService. Возможно, ваш DatabaseModule должен экспортировать его вместе с DatabaseService (LayoutmgmtService должен использовать любой из них). Кроме того, вы должны добавить данную услугу к providers из LayoutmgmtModule

...