본문 바로가기

JavaScript

Node.js 숙련 주차 개인 과제_2

728x90

Node.js 숙련 주차 개인 과제_2

 

📌 게시글 API

게시글 작성& 조회 [출처 : 스타르타코딩클럽]
게시글 상세조회& 수정 & 삭제 [출처: 스타르타코딩클럽]


📌 Post 모델 생성(Terminal)

npx sequelize model:generate --name Post --attributes title:string,content:string,userId:integer

Id → postId 수정

userId를 외래키로 user모델과 연결

 

📄 /models/post.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Post extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
      models.Post.belongsTo(models.User, {foreignKey: "userId"})
    }
  }
  Post.init({
    postId: {
      primaryKey: true,
      type: DataTypes.INTEGER,
    },
    title: DataTypes.STRING,
    content: DataTypes.STRING,
    userId: DataTypes.INTEGER
  }, {
    sequelize,
    modelName: 'Post',
  });
  return Post;
};

 

📄 /migrations/숫자-create-post.js 파일

'use strict';
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.createTable('Posts', {
      postId: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      title: {
        type: Sequelize.STRING
      },
      content: {
        type: Sequelize.STRING
      },
      userId: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  async down(queryInterface, Sequelize) {
    await queryInterface.dropTable('Posts');
  }
};

 

 

📌 테이블 생성하기(Terminal)

npx sequelize db:migrate

posts 테이블 생성


게시글 작성

 

📄 app.js

const { User, Post } = require("./models");

// 게시글 작성
router.post("/posts", authMiddleware, async(req,res) =>{
  try {
    const { userId } = res.locals.user;
    const { title, content } = req.body;
  
    if(Object.keys(req.body).length === 0){
      res.status(412).send({
        errorMessage: "데이터 형식이 올바르지 않습니다."
      });
      return;
    }
  
    if(!title){
      res.status(412).send({
        errorMessage: "게시글 제목의 형식이 일치하지 않습니다."
      });
      return;
    }
  
    if(!content){
      res.status(412).send({
        errorMessage: "게시글 내용의 형식이 일치하지 않습니다."
      });
      return;
    }
  
    await Post.create({ title, content, userId })
    res.status(201).send({ message: "게시글 작성에 성공하였습니다." });

  } catch(error) {
    res.status(400).json({
      errorMessage: "게시글 작성에 실패하였습니다."
    });
  }

})

 

 

📌 ThunderClient

[POST] http://localhost:8080/api/posts

 

headers

Authorization : Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsImlhdCI6MTY3MTY3ODA5NSwiZXhwIjoxNjcxNzY0NDk1fQ.zaiFCRBx9_odl688SvlmlIBTnCuXtmqSaZC_BKD42W4

header 설정

 

body - json

게시글 작성


게시글 조회

 

📄 app.js

// 게시글 조회
router.get("/posts", async(req, res) => {
  try{
    const posts = await Post.findAll({
      include: [{
        model: User,
        required: false,
        attributes: ['nickname'],
      }]
    })
  
    res.json({"data": posts});
  } catch(error) {
    res.status(400).json({
      errorMessage: "게시글 조회에 실패하였습니다."
    });
  }

})

 

📌 ThunderClient

[GET] http://localhost:8080/api/posts

게시글 조회


게시글 상세조회

 

📄 app.js

// 게시글 상세 조회
router.get("/posts/:postId", async(req,res) => {
  try{
    const { postId } = req.params;
    const post = await Post.findOne({
      where: { postId },
      include: [{
        model: User,
        required: false,
        attributes: ['nickname'],
      }]
    });
    res.json({"data": post});
  } catch(error) {
    res.status(400).json({
      errorMessage: "게시글 조회에 실패하였습니다."
    });
  }

})

 

📌 ThunderClient

[GET] http://localhost:8080/api/posts/4

게시글 상세 조회


게시글 수정

 

📄 app.js

// 게시글 수정
router.put("/posts/:postId", authMiddleware, async(req,res) => {
  try{
    if(Object.keys(req.body).length === 0){
      res.status(412).send({
        errorMessage: "데이터 형식이 올바르지 않습니다."
      });
      return;
    }
  
    const { userId } = res.locals.user;
    const { title, content } = req.body;
    const { postId } = req.params;
  
    if(!title){
      res.status(412).send({
        errorMessage: "게시글 제목의 형식이 일치하지 않습니다."
      });
      return;
    }  
  
    if(!content){
      res.status(412).send({
        errorMessage: "게시글 내용의 형식이 일치하지 않습니다."
      });
      return;
    }  
  
    const post = await Post.findOne({
      where: { postId, userId }
    });
  
    if(!post){
      res.status(401).send({
        errorMessage: "게시글이 정상적으로 수정되지 않았습니다."
      });
      return;
    }
  
    post.title = title;
    post.content = content;
    await post.save();
    res.status(200).send({ message: "게시글을 수정하였습니다." });
  } catch(error) {
    res.status(400).json({
      errorMessage: "게시글 수정에 실패하였습니다"
    });
  }

})

 

📌 ThunderClient

[PUT] http://localhost:8080/api/posts/4

 

headers

userId : 2 

Authorization : Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsImlhdCI6MTY3MTY3ODA5NSwiZXhwIjoxNjcxNzY0NDk1fQ.zaiFCRBx9_odl688SvlmlIBTnCuXtmqSaZC_BKD42W4

Header

body - json

 

posts 테이블

post 테이블


게시글 삭제

 

📄 app.js

// 게시글 삭제
router.delete("/posts/:postId", authMiddleware, async(req,res) =>{
  try{
    const { userId } = res.locals.user;
    const { postId } = req.params;

    const existPost = await Post.findByPk(postId);
    if(!existPost) {
      res.status(404).send({
        errorMessage: "게시글이 존재하지 않습니다."
      });
      return;
    }

    const post = await Post.findOne({
      where: { postId, userId }
    });

    if(!post){
      res.status(401).send({
        errorMessage: "게시글이 정상적으로 삭제되지 않았습니다."
      });
      return;
    }

    await post.destroy();
    res.status(200).send({ message: "게시글을 삭제하였습니다." });
  } catch(error) {
    res.status(400).json({
      errorMessage: "게시글 삭제에 실패하였습니다"
    });
  }

})

 

📌 ThunderClient

[DELETE] http://localhost:8080/api/posts/1

 

headers

userId : 1

Authorization : Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImlhdCI6MTY3MTY3Njk0NiwiZXhwIjoxNjcxNzYzMzQ2fQ.GX0sFegcxbH4B4mX994NqrfRJbmSbqRPg8Ir5tLHMcQ

 

게시글 삭제

'JavaScript' 카테고리의 다른 글

Node.js 심화 1주차_1  (0) 2022.12.26
Node.js 숙련 주차 개인 과제_3  (0) 2022.12.23
Node.js 숙련 주차 개인 과제_1  (0) 2022.12.22
Node.js 숙련 1주차_6  (1) 2022.12.21
Node.js 숙련 1주차_5  (0) 2022.12.21