РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpSeDs 72 of 201 menu
◀ ▶

Отдельный наполнитель в Nest

Логика подготовки строк разрастается, и сервис страницы начинает совмещать ответы клиенту с начальным заполнением таблицы. Такой код труднее читать и переиспользовать в другом модуле.

Отдельный класс наполнителя держит только работу с репозиторием и готовыми значениями полей. Модуль темы при инициализации получает этот класс через внедрение и запускает его операцию один раз, когда зависимости уже собраны.

Покажем на примере постов:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class Post { @PrimaryGeneratedColumn() id: number; @Column() title: string; }

Класс наполнителя сохранит две заготовки:

import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Post } from '../post.entity.js'; @Injectable() export class PostSeeder { postRepository: Repository<Post>; constructor( @InjectRepository(Post) postRepository: Repository<Post>, ) { this.postRepository = postRepository; } async seed() { await this.postRepository.save([ { title: 'Morning note' }, { title: 'Evening note' }, ]); } }

Сервис страницы только читает таблицу:

import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Post } from '../post.entity.js'; @Injectable() export class PostService { postRepository: Repository<Post>; constructor( @InjectRepository(Post) postRepository: Repository<Post>, ) { this.postRepository = postRepository; } findAll() { return this.postRepository.find(); } }

Модуль темы при старте вызовет наполнитель:

import { Module, OnModuleInit } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Post } from '../post.entity.js'; import { PostController } from './post.controller.js'; import { PostSeeder } from './post.seeder.js'; import { PostService } from './post.service.js'; @Module({ imports: [TypeOrmModule.forFeature([Post])], controllers: [PostController], providers: [PostService, PostSeeder], }) export class PostsModule implements OnModuleInit { postSeeder: PostSeeder; constructor(postSeeder: PostSeeder) { this.postSeeder = postSeeder; } onModuleInit() { void this.postSeeder.seed(); } }

Контроллер откроет список:

import { Controller, Get } from '@nestjs/common'; import { PostService } from './post.service.js'; @Controller('posts') export class PostController { postService: PostService; constructor(postService: PostService) { this.postService = postService; } @Get() findAll() { return this.postService.findAll(); } }

Корень поднимает канал к базе и импортирует модуль темы:

import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { PostsModule } from './posts/posts.module.js'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: 'postgres', database: 'site', autoLoadEntities: true, synchronize: true, }), PostsModule, ], }) export class AppModule {}

Вынесите заполнение таблицы работников в отдельный класс наполнителя, вызовите его при старте WorkersModule, список откройте в WorkerController через WorkerService и подключите модуль к PostgreSQL в корне.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить