Elasticsearch module for Nest. This module supports elasticsearch version 5.x to 7.x
# 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
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.
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.