0
votes

I am using Nestjs framework to develop my Elastic Service application. I am using '@nestjs/elasticsearch' library inside my code and i am simply trying to establish database connection and use inside all other module. Please find my code example here.

My App Module looks below

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 {}

My Database Module is,

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 {}

My Database Service is,

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

}

Now Above i had initialized the connection and its getting connected to the database without issues, But i am trying to re-use ElasticsearchService in another module/service called layout module

Layout Module looks below

import { Module } from '@nestjs/common';
import { LayoutmgmtController } from './layoutmgmt.controller';
import { LayoutmgmtService } from './layoutmgmt.service';

@Module({    
  controllers: [LayoutmgmtController],
  providers: [LayoutmgmtService],  
})
export class LayoutmgmtModule {}

Layout Service Looks below

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

}

If i use the ElasticSErachService in above service inside the constructor i am getting the below error, I wanted to reuse the existing connection ..

[Nest] 10724 - 10/14/2019, 4:50:41 PM [ExceptionHandler] Nest can't resolve dependencies of the LayoutmgmtService (?). Please make sure that the argument at index [0] is available in the LayoutmgmtModule context. +40ms Error: Nest can't resolve dependencies of the LayoutmgmtService (?). Please make sure that the argument at index [0] is available in the LayoutmgmtModule context. at Injector.lookupComponentInExports (C:\Subu\Elastic\elastic-nest-js\node_modules@nestjs\core\injector\injector.js:183:19) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:744:11) at Object. (C:\Subu\Elastic\elastic-nest-js\node_modules\ts-node\src\bin.ts:158:12) at Module._compile (internal/modules/cjs/loader.js:688:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10) at Module.load (internal/modules/cjs/loader.js:598:32) at tryModuleLoad (internal/modules/cjs/loader.js:537:12) at Function.Module._load (internal/modules/cjs/loader.js:529:3) at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)

2

2 Answers

1
votes

LayoutmgmtModule and DatabaseModule are not related anyway in your code. You have registered the ElasticsearchModule in DatabaseModule but not in LayoutmgmtModule so it is unable to find the service.

Solution 1

You can get rid of the LayoutmgmtModule by just adding LayoutmgmtController and LayoutmgmtService in DataBaseModule and it should start working

Solution 2

You can make DataBaseModule as global by just adding @Global() before @Module decorator as mentioned here

0
votes

You are not exporting ElasticsearchService anywhere. Perhaps your DatabaseModule should export it together with DatabaseService (LayoutmgmtService should use either of those). On top of that, you should add given Service to providers of LayoutmgmtModule