const express = require('express')
const multer = require('multer')
const path = require('path')
const fs = require('fs')
const { Post, Image, Comment, User, Hashtag } = require('../models')
const { isLoggedIn } = require('./middlewares')
const router = express.Router()
try {
fs.accessSync('uploads')
} catch(error) {
console.log('uploads 폴더가 없으므로 생성합니다.')
fs.mkdirSync('uploads')
}
// multer 셋팅
const upload = multer({
storage: multer.diskStorage({
destination(req, file, done) {
done(null, 'uploads')
},
filename(req, file, done) {
const ext = path.extname(file.originalname) // 확장자 추출(.png)
const basename = path.basename(file.originalname, ext) // 이름 추출(제로초)
done(null, basename + '_' + new Date().getTime() + ext) // 이름_1518123131.png
},
}),
limits: { fileSize: 20 * 1024 * 1024 }, // 20MB
})
// 게시글 작성
router.post('/', isLoggedIn, upload.none(), async (req, res, next) => {
try {
// const hashtags = req.body.content.math(/#[^\s#]+/g)
const post = await Post.create({
content: req.body.content,
UserId: req.user.id,
})
// if(hashtags) {
// const result = await Promise.all(hashtags.map((tag) => Hashtag.findOrCreate({
// where: { name: tag.slice(1).toLowerCase() },
// }))); // 결과 [[노드, true], [리액트, true]]
// await post.addHashtags(result.map((v) => v[0]));
// }
if(req.body.image) {
if(Array.isArray(req.body.image)) { // 이미지 여러개면 image: [경로.png, 경로.png]
const images = await Promise.all(req.body.image.map((image) => Image.create({ src: image })))
await post.addImages(images)
} else { // 이미지 하나만 올리면 image: 경로.png
const image = await Image.create({ src: req.body.image })
await post.addImages(image)
}
}
const fullPost = await Post.findOne({
where: { id: post.id },
include: [{
model: Image,
}, {
model: Comment,
include: [{
model: User, // 댓글 작성자
attributes: ['id', 'nickname'],
}]
}, {
model: User, // 게시글 작성자
attributes: ['id', 'nickname'],
}, {
model: User, // 좋아요 누른 사람
as: 'Likers',
attributes: ['id'],
}]
})
res.status(201).json(fullPost)
} catch(error) {
console.error(error)
next(error)
}
})
router.post('/:postId/comment', isLoggedIn, async (req, res, next) => {
try {
const post = await Post.findOne({
where: { id: req.params.postId }
})
if(!post) { // 게시글 존재하는지 확인
return res.status(403).send('존재하지 않는 게시글입니다.')
}
const comment = await Comment.create({
content: req.body.content,
PostId: parseInt(req.params.postId),
UserId: req.user.id,
})
const fullComment = await Comment.findOne({
where: { id: comment.id },
include: [{
model: User,
attributes: ['id', 'nickname']
}]
})
res.status(201).json(fullComment)
} catch(error) {
console.error(error)
next(error)
}
})
// 좋아요 누르기
router.patch('/:postId/like', isLoggedIn, async (req, res, next) => { // PATCH /post/1/like
try {
const post = await Post.findOne({ where: { id: req.params.postId }})
if(!post) {
return res.status(403).send('게시글이 존재하지 않습니다.')
}
await post.addLikers(req.user.id)
res.json({ PostId: post.id, UserId: req.user.id })
} catch(error) {
console.error(error)
next(error)
}
})
// 좋아요 취소
router.delete('/:postId/like', isLoggedIn, async (req, res, next) => { // DELETE /post/1/like
try {
const post = await Post.findOne({ where: { id: req.params.postId }})
if(!post) {
return res.status(403).send('게시글이 존재하지 않습니다.')
}
await post.removeLikers(req.user.id)
res.json({ PostId: post.id, UserId: req.user.id })
} catch(error) {
console.error(error)
next(error)
}
})
// 게시글 삭제
router.delete('/:postId', isLoggedIn, async (req, res, next) => { // DELETE /post/10
try {
await Post.destroy({
where: {
id: req.params.postId,
UserId: req.user.id,
},
})
res.status(200).json({ PostId: parseInt(req.params.postId, 10) })
} catch(error) {
console.error(error)
next(error)
}
})
// 이미지 업로드
router.post('/images', isLoggedIn, upload.array('image'), (req, res, next) => {
console.log(req.files)
res.json(req.files.map((v) => v.filename))
})
module.exports = router
앗 해결했습니다! 역시 안될 때는 딴거하다가 나중에 다시 봐야하는 것 같아요.