Files
docs/docs/60-common-modules/data-store/01-usage.md
T
2026-06-16 15:43:18 +03:00

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’ы одного имени в разных модулях изолированы друг от друга.