사용자 지정 엔터티와 상호 작용하는 Medusa

이제 custom entity을 설정하고 사용할 준비가 되었으므로 어떻게 상호 작용할 수 있는지 살펴보겠습니다.

이 문서에서는 이 사용자 지정 엔터티에 대한 새 레코드를 만드는 방법과 데이터베이스의 모든 활성 항목을 나열하는 방법을 알아봅니다.

저장소 생성



가장 먼저 생성해야 할 것은 모델과 상호 작용할 수 있는 새 리포지토리입니다.
repositories라는 새 폴더를 만듭니다. 내부에서 post.ts 파일을 생성합니다.

import { EntityRepository, Repository } from 'typeorm';

import { Post } from '../models/post';

@EntityRepository(Post)
export class PostRepository extends Repository<Post> {}


이 파일은 엔티티와 상호 작용할 수 있도록 리포지토리의 typeORM 기능을 확장합니다.

서비스 만들기



앞에서 배운 것처럼 서비스는 medusa의 논리이므로 post.js라고 하는 새 사용자 지정 서비스를 만들어 보겠습니다.

기본적으로 필요한 요소를 구성해야 합니다.

import { TransactionBaseService } from '@medusajs/medusa';

class PostService extends TransactionBaseService {
  constructor({ postRepository, manager }) {
    super({ postRepository, manager });

    this.postRepository = postRepository;
    this.manager_ = manager;
  }
}

export default PostService;


그런 다음 필요한 두 가지 기능을 추가하는 작업으로 넘어갑니다.
첫 번째는 새 레코드를 추가하는 생성 기능입니다.

class PostService extends TransactionBaseService {
  async create(name) {
    const postRepository = this.manager_.getCustomRepository(
      this.postRepository
    );
    const post = await postRepository.create({ name: name });
    return await postRepository.save(post);
  }
}


여기에 하나의 매개변수를 허용하고 이 엔티티에서 typeORM의 create 함수를 호출하는 create 함수가 있습니다.
그런 다음 새로 만든 엔터티를 저장합니다.

엔티티에 BeforeInsert를 사용했기 때문에 각 항목에 대한 새 ID가 자동으로 생성됩니다.

우리가 원하는 두 번째 기능은 데이터베이스의 모든 게시물을 나열하는 목록 기능입니다.

class PostService extends TransactionBaseService {
  async list() {
    const postRepository = this.manager_.getCustomRepository(
      this.postRepository
    );
    return await postRepository.find();
  }
}


이것이 우리 서비스의 전부입니다.

경로



마지막 부분은 이 서비스와 상호 작용할 몇 가지 경로를 만드는 것입니다.

이를 위해 api/index.js 파일을 사용하겠습니다.

새 레코드 생성부터 시작하겠습니다. 이를 위해 데이터를 수락할 수 있도록 본문 파서를 활성화해야 합니다.

import { Router } from 'express';
import bodyParser from 'body-parser';

export default () => {
  const router = Router();

  router.post('/store/post', bodyParser.json(), async (req, res) => {
    const postService = req.scope.resolve('postService');
    const { name } = req.body;
    if (!name) {
      res.status(400).json({
        msg: 'Name not supplied.',
      });
      return;
    }
    const post = await postService.create(name);
    console.log(post);
    res.json({ msg: 'Post created', id: post.id });
  });

  return router;
};


이 메서드는 사용자 지정 포스트 서비스를 검색하고 보내는 본문에서 이름 속성을 추출합니다.
없는 경우 400 상태로 사용자에게 알립니다.

지금 이 경로에 게시하면 어떻게 되는지 봅시다.



그렇지 않으면 방금 추가한 생성 함수를 호출합니다.

목록 기능으로 넘어 갑시다.

router.get('/store/post', async (req, res) => {
  const postService = req.scope.resolve('postService');
  res.json(await postService.list());
});


그리고 그게 다야. 이제 레코드를 가져올 수 있습니다.



읽어주셔서 감사합니다. 연결합시다!



제 블로그를 읽어주셔서 감사합니다. 내 이메일 뉴스레터를 구독하고 Facebook에 연결하거나

좋은 웹페이지 즐겨찾기