3.3 KiB
Использование
Подключение в AppModule
В корневом модуле приложения необходимо инициализировать DataStoreModule с помощью метода
forRoot. В production используется хранилище на базе БД.
// app.module.ts
import { Module } from '@nestjs/common';
import { DataStoreModule } from '@src/server/data-store';
import { FooModule } from './foo/foo.module';
@Module({
imports: [DataStoreModule.forRoot(), FooModule],
})
export class AppModule {}
Подключение bucket в feature-модуле
Каждый feature-модуль определяет, какие bucket’ы ему нужны, через метод forFeature.
// foo.module.ts
import { Module } from '@nestjs/common';
import { DataStoreModule } from '@src/server/data-store';
import { FooService } from './foo.service';
@Module({
imports: [DataStoreModule.forFeature('foo', ['settings'])],
providers: [FooService],
exports: [FooService],
})
export class FooModule {}
В примере выше модуль foo получает доступ к bucket с именем settings.
Важно: В feature-модуле будут доступны только bucket'ы указанные в
forFeature. Попытка инжектировать не объявленный bucket приведёт к ошибке.
Инжектирование bucket в сервис
Для работы с bucket используется декоратор @InjectDataStore(bucketName). Каждый сервис получает
свой экземпляр DataStore для конкретного bucket.
// foo.service.ts
import { Injectable } from '@nestjs/common';
import { InjectDataStore, DataStore } from '@src/server/data-store';
@Injectable()
export class FooService {
constructor(
@InjectDataStore('settings')
private readonly bucket: DataStore<string, { value: string }>,
) {}
async saveValue(key: string, value: string) {
await this.bucket.set(1, key, { value });
}
async loadValue(key: string) {
return this.bucket.get(1, key);
}
}
Независимость bucket’ов разных модулей и конкурсов
Даже если несколько модулей используют bucket с одинаковым именем ('test'), они будут полностью
изолированы.
Пример:
- FooModule с bucket
testи - BarModule с bucket
test
получат разные хранилища, и данные не будут пересекаться.
Тоже самое и для разных конкурсов: данные для contestId = 1 и contestId = 2 будут храниться
отдельно.
Резюме
- В
AppModuleподключаемDataStoreModule.forRoot(...). - В каждом feature-модуле объявляем нужные bucket’ы через
forFeature(...). - Доступ к bucket в сервисе осуществляется через
@InjectDataStore. - Bucket’ы одного имени в разных модулях изолированы друг от друга.