1.0.6 • Published 4 years ago

@bm629/nest-elasticsearch v1.0.6

Weekly downloads
7
License
MIT
Repository
github
Last release
4 years ago

npm version Coverage Status License: MIT Build Status

Description

Elasticsearch module for Nest. This module supports elasticsearch version 5.x to 7.x

Installation

# For version 7.x
$ npm i --save @bm629/nest-elasticsearch es7@npm:@elastic/elasticsearch

# For version 6.x
$ npm i --save @bm629/nest-elasticsearch es6@npm:@elastic/elasticsearch@6

# For version 5.x
$ npm i --save @bm629/nest-elasticsearch es5@npm:@elastic/elasticsearch@5

Usage

Import Elasticsearch Module

// For elastic client version 7.x
@Module({
  imports: [ElasticsearchModule.forRoot({
    node: 'localhost:9200',
  })],
  providers: [...],
})
export class SearchModule {}

// OR

// For elastic client version 6.x
@Module({
  imports: [ElasticsearchModule.forRoot({
    node: 'localhost:9200',
    version: 'v6'
  })],
  providers: [...],
})
export class SearchModule {}


// OR


// For elastic client version 5.x
@Module({
  imports: [ElasticsearchModule.forRoot({
    node: 'localhost:9200',
    version: 'v5'
  })],
  providers: [...],
})
export class SearchModule {}

Import Database module in AppModule

// app.module.ts

@Module({
  imports: [SearchModule],
  controllers: [CatsController],
  providers: [CatSevice],
})
export class AppModule {}

Inject Elasticsearch client

// cat.service.ts

import { Client } from 'es7';

export class CatService {
  contructor(@InjectElasticsearchClient() private readonly elasticsearchClient: Client) {}
}

For more information, see test cases. You can find details in the __tests__/ folder of this repository.

Async Options

Quite often you might want to asynchronously pass your module options instead of passing them beforehand. In such case, use forRootAsync() method, that provides a couple of various ways to deal with async data.

1. Use factory

ElasticsearchModule.forRootAsync({
  useFactory: () => ({
    node: 'localhost:9200',
  }),
});

Obviously, our factory behaves like every other one (might be async and is able to inject dependencies through inject).

ElasticsearchModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    node: configService.getString('ELASTICSEARCH_NODE'),
  }),
  inject: [ConfigService],
}),

2. Use class

ElasticsearchModule.forRootAsync({
  useClass: ElasticsearchConfigService,
});

Above construction will instantiate ElasticsearchConfigService inside ElasticsearchModule and will leverage it to create options object.

class ElasticsearchConfigService implements ElasticsearchOptionsFactory {
  createElasticsearchOptions(): ElasticsearchModuleOptions {
    return {
      node: 'localhost:9200',
    };
  }
}

3. Use existing

ElasticsearchModule.forRootAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
}),

It works the same as useClass with one critical difference - ElasticsearchModule will lookup imported modules to reuse already created ConfigService, instead of instantiating it on its own.

License

MIT licensed.