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
게시글 작성
📄 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
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
body - json
posts 테이블
게시글 삭제
📄 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 |