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

Вложенная операция в Nest

Бывает, что материал нельзя записать, пока в соседней таблице нет строки автора. Если сохранить автора отдельным блоком, а затем открыть второй для материала, между ними снова возможен частичный результат при сбое.

В одном callback блока transaction сначала пишут соседа, затем основную строку с полем связи. Оба шага идут через тот же менеджер, без второго независимого блока и без отдельного репозитория между ними.

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

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

У материала зададим связь с автором:

import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; import { Author } from './author.entity.js'; @Entity() export class Post { @PrimaryGeneratedColumn() id: number; @Column() title: string; @ManyToOne(() => Author) author: Author; }

Сервис в одном callback сохранит автора и материал с привязкой:

import { Injectable } from '@nestjs/common'; import { DataSource } from 'typeorm'; import { Author } from '../author.entity.js'; import { Post } from '../post.entity.js'; @Injectable() export class PostService { dataSource: DataSource; constructor(dataSource: DataSource) { this.dataSource = dataSource; } addWithAuthor() { return this.dataSource.transaction(async (manager) => { const author = await manager.save(Author, { name: 'Ann', }); return manager.save(Post, { title: 'Morning note', author, }); }); } }

Контроллер откроет действие совместной записи:

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

Модуль темы регистрирует обе сущности и классы страницы:

import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Author } from '../author.entity.js'; import { Post } from '../post.entity.js'; import { PostController } from './post.controller.js'; import { PostService } from './post.service.js'; @Module({ imports: [TypeOrmModule.forFeature([Post, Author])], controllers: [PostController], providers: [PostService], }) export class PostsModule {}

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

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 {}

Запишите строку отдела и связанного с ней работника одним блоком в WorkerService, откройте действие в WorkerController и соберите WorkersModule с базой в корне.

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