Sequelize를 사용하여 CRUD 실행

part one of this article에서 Sequelize 설정, 마이그레이션/모델 생성 및 파종 데이터베이스를 소개했습니다.이 부분에서 우리는 첫 번째 부분에서 CRUD 구축을 실행할 것이다.
만약 당신이 계속하고 싶다면, part one부터, 만약 당신이 아직 이렇게 하지 않았다면, 당신은 첫 번째 단계에 익숙해졌다면, 당신은 이 부분으로 자유롭게 뛸 수 있다.

You can clone the complete code for this article here


종속 항목 설치


 npm i express
변경될 때마다 서버를 다시 시작해서 수동으로 서버를 다시 시작하는 압력을 줄여주는 노드몬을 설치해야 합니다.
 npm i -D nodemon
-D 로고를 주의하십시오. 이 로고는 개발 환경에서만 가방이 필요하다는 것을 지시합니다.

Express Server 설치 프로그램


서버를 설정하려면 두 개의 디렉터리 - serverroutes 를 만들어야 합니다.
mkdir server routes
색인을 만듭니다.serverroutes 디렉토리의 js 파일:
touch server/index.js routes/index.js
다음 코드 추가routes/index.js

const { Router } = require('express');

const router = Router();

router.get('/', (req, res) => res.send('Welcome'))

module.exports = router;
다음 코드 추가server/index.js
const express = require('express');
const routes = require('../routes');

const server = express();
server.use(express.json());

server.use('/api', routes);

module.exports = server;
다음은 프로젝트의 루트 디렉터리에 응용 프로그램 입구점을 만듭니다.
touch index.js

다음 코드 추가index.js
require('dotenv').config();

const server = require('./server');

const PORT = process.env.PORT || 3300;

server.listen(PORT, () => console.log(`Server is live at localhost:${PORT}`));

마지막으로 스크립트를 package.json 에 추가합니다.
다음 코드 추가package.json
 "scripts": {
    "start-dev": "nodemon index.js"
  },
서버를 시작하려면 실행
npm start-dev
이제 POSTMAN에서 액세스localhost:3300/api를 반환하면 서버가 시작되고 실행 중임을 나타냅니다.

새 게시물 만들기 [C IN CRUD]


우선 CRUD 논리를 포함하는 새 파일"Welcome"을 만듭니다.
mkdir controllers && touch controllers/index.js
다음 코드 추가controllers/index.js
const models = require('../database/models');

const createPost = async (req, res) => {
  try {
    const post = await models.Post.create(req.body);
    return res.status(201).json({
      post,
    });
  } catch (error) {
    return res.status(500).json({error: error.message})
  }
}

module.exports = {
  createPost,
}

다음은 새 게시물을 만드는 경로를 만들어야 합니다.편집controllers/index.js은 다음과 같습니다.
const { Router } = require('express');
const controllers = require('../controllers');

const router = Router();

router.get('/', (req, res) => res.send('Welcome'))

router.post('/posts', controllers.createPost);

module.exports = router;
이제 Postman에서 Create Post 끝점routes/index.js에 액세스하여 본문에 적절한 값을 요청하면 다음 화면 캡처와 같이 새 게시물이 작성됩니다.

게시물 목록 가져오기 [R in CRUD]


우리는 게시물 목록을 검색하기 위해 또 다른 단점을 만들 것이다.여기서 Sequelize가 제공하는 ORM의 [POST] localhost:330/api/posts 기능을 적용합니다.즉시 불러오는 것은 모델을 조회하는 동시에 관련 모델을 검색하는 것을 의미한다.Sequelize에서 eager loading 속성을 사용하여 다음 코드 세그먼트와 같이 즉시 불러옵니다.
다음 코드를 include 에 추가합니다.
const getAllPosts = async (req, res) => {
  try {
    const posts = await models.Post.findAll({
      include: [
        {
          model: models.Comment,
          as: 'comments'
        },
        {
          model: models.User,
          as: 'author'
        }
      ]
    });
    return res.status(200).json({ posts });
  } catch (error) {
    return res.status(500).send(error.message);
  }
}
controllers/index.js 객체에 getAllPosts 를 추가하여 내보냅니다module.exports.
module.exports = {
  createPost,
  getAllPosts
}
다음 코드를 routes/index.js에 추가하여 끝점을 정의합니다.
router.get('/posts', controllers.getAllPosts);

이제 Postman에서 Get All Post 끝점[GET] localhost:330/api/posts에 액세스하면 다음과 같이 응답합니다.

모든 댓글에는 댓글 그룹과 이와 관련된author 대상이 있습니다. 이것이 바로 즉시 불러오는 것입니다

단일 게시물 가져오기 [CRUD의 R]


Sequelize는 모델의 주어진 속성에 따라 단일 기록을 검색하는 방법findOne을 제공합니다.
다음 코드 추가controllers/index.js
const getPostById = async (req, res) => {
  try {
    const { postId } = req.params;
    const post = await models.Post.findOne({
      where: { id: postId },
      include: [
        {
          model: models.Comment,
          as: 'comments',
          include: [
           {
            model: models.User,
            as: 'author',
           }
          ]
        },
        {
          model: models.User,
          as: 'author'
        }
      ]
    });
    if (post) {
      return res.status(200).json({ post });
    }
    return res.status(404).send('Post with the specified ID does not exists');
  } catch (error) {
    return res.status(500).send(error.message);
  }
}
다음은 routes/index.js에 다음 코드를 추가하여 단점을 만듭니다
router.get('/posts/:postId', controllers.getPostById);
현재 Postman에서 [GET] localhost:330/api/posts/1에 액세스할 때 다음과 같이 응답합니다.

답장을 보십시오. 우리는 중첩된 실시간 불러오기를 사용하여 댓글 작성자의 평론을 얻습니다.

게시물 업데이트 [U in CRUD]


Sequelize의 update 방법은 매개 변수로 전달된 대상에 지정된 주어진 모델 필드를 업데이트합니다.이것은 update 방법에 전달되는 대상을 수동으로 검사하고 모델 필드를 업데이트하는 압력을 감소시켰다.
다음 코드 추가controllers/index.js
const updatePost = async (req, res) => {
  try {
    const { postId } = req.params;
    const [ updated ] = await models.Post.update(req.body, {
      where: { id: postId }
    });
    if (updated) {
      const updatedPost = await models.Post.findOne({ where: { id: postId } });
      return res.status(200).json({ post: updatedPost });
    }
    throw new Error('Post not found');
  } catch (error) {
    return res.status(500).send(error.message);
  }
};
그리고 다음 코드를 routes/index.js에 추가하여 끝점을 만듭니다
router.put('/posts/:postId', controllers.updatePost);

게시물 삭제 [D in CRUD]


Sequelize는 모델 레코드를 삭제하는 방법destroy을 제공합니다.
다음 코드 추가controllers/index.js
const deletePost = async (req, res) => {
  try {
    const { postId } = req.params;
    const deleted = await models.Post.destroy({
      where: { id: postId }
    });
    if (deleted) {
      return res.status(204).send("Post deleted");
    }
    throw new Error("Post not found");
  } catch (error) {
    return res.status(500).send(error.message);
  }
};
다음과 같이 routes/index.js 업데이트를 사용합니다.
router.delete('/posts/:postId', controllers.deletePost);

결론


우리는 이미 Sequelize를 사용하여 CRUD를 실현할 수 있다.그러나 간단함을 유지하기 위해 우리는 표 입력 검증, 오류 처리, 적당한 관심사 분리 등 일부 부분을 뛰어넘었다.따라서 당신은 진일보한 개선을 결정할 수 있습니다.
만약 당신에게 어떤 문제나 문장의 개선에 기여가 있다면, 언제든지 어떤 편리한 방식으로 저에게 연락하십시오.

권장 리소스

  • Express Validator
  • Sequelize Docs
  • How to write a production-ready Node and Express app
  • 좋은 웹페이지 즐겨찾기