개발자의 logs
nodejs multer s3에 연결하기 소스코드 source code 본문
실전 팀작업을 하던 중 multer를 이용해서 s3에 사진을 업로드해야했다.
프론트에게 물어보니, 파이어베이스로 프론트 쪽에서 하던 것을 백엔드가 이미지를 알아서 처리해주니 한결 편하다고 한다.
각설하고 소스코드를 우선 공개한다.
블로그나 구글링을 하다보면 코드를 중간중간 . . . 처리를 한다거나 삭제 및 숨김을 해서 붙여넣기하면 온전히 코드가 돌아가기 힘든데,
난 그런 부분들이 오히려 다른사람들의 개발에 어려움을 주는 것 같아 때문에 파일 전체를 올린다.
아래는 게시물 관련 api routes 파일이다. 즉, posts.js
const dotenv = require('dotenv').config();
const express = require('express');
const router = express.Router();
const postController = require('../controller/posts');
const authMiddleware = require('../middlewares/auth-middleware');
const isMember = require('../middlewares/isMember');
const AWS = require('aws-sdk');
const multerS3 = require('multer-s3');
const multer = require('multer');
const fs = require('fs');
const path = require('path');
const s3 = new AWS.S3({
accessKeyId: process.env.accessKeyId,
secretAccessKey: process.env.secretAccessKey,
region: 'ap-northeast-2',
});
const upload = multer({
storage: multerS3({
s3: s3,
bucket: 'kimha',
contentType: multerS3.AUTO_CONTENT_TYPE,
acl: 'public-read-write',
key: function (req, file, cb) {
cb(null, `uploads/${Date.now()}_${file.originalname}`);
},
}),
});
//글 작성
router.post(
'/post/workSpaceName',
upload.single('img'),
authMiddleware,
isMember,
postController.postUpload
);
// 글 전체 조회(임시)
router.get(
'/post/workSpaceName',
authMiddleware,
isMember,
postController.postAllView
);
// 글 한개 조회
router.get(
'/post/workSpaceName/:postId',
authMiddleware,
isMember,
postController.postView
);
// 글 수정
router.put(
'/post/workSpaceName/:postId',
authMiddleware,
isMember,
postController.postEdit
);
// 글 삭제
router.delete(
'/post/workSpaceName/:postId',
authMiddleware,
isMember,
postController.postDelete
);
// router.post('/image', upload.single('image'), postController.postImage);
module.exports = router;
아래는 routes posts.js 파일이다.
postUpload 함수쪽 게시물 등록하는 부분만 보면된다.
const Post = require('../schemas/post');
const postComment = require('../schemas/postComment');
const AWS = require('aws-sdk');
const multerS3 = require('multer-s3');
const multer = require('multer');
const fs = require('fs');
const path = require('path');
// 공지 글 전체 조회
async function postAllView(req, res, next) {
try {
//#swagger.tags= ['일반 게시글 API'];
//#swagger.summary= '게시글 글 전체 조회 API'
//##swagger.description='-'
const { workSpaceName } = req.body;
const posts = await Post.find({ workSpaceName }).sort('-postId');
res.send({ posts, message: '공지 조회에 성공 했습니다.' });
} catch (error) {
console.log(error);
res.status(400).send({ error, errMessage: '공지 조회에 실패 했습니다.' });
}
}
//글 하나 조회
// 이 부분도 파라미터 값 받아야함
async function postView(req, res, next) {
try {
// 글 작성하기
//#swagger.tags= ['일반 게시글 API'];
//#swagger.summary= '일반게시글 특정 글 조회 API'
//#swagger.description='-'
const postId = Number(req.params.postId);
const existsPost = await Post.find({ postId });
if (!existsPost.length) {
return res
.status(400)
.json({ ok: false, errorMessage: '찾는 게시물 없음.' });
}
const existsComment = await postComment.find({ postId }).sort({
commentId: -1,
});
res.json({ existsPost, existsComment });
} catch (err) {
console.log(err);
res.status(400).send({
errorMessage: '요청한 데이터 형식이 올바르지 않습니다.',
});
}
}
// 글 수정
// 수정시간 넣기
// 카테고리 빼기
async function postEdit(req, res, next) {
try {
//#swagger.tags= ['일반 게시글 API'];
//#swagger.summary= '일반 게시글 글 수정 API'
//#swagger.description='-'
const postId = Number(req.params.postId);
const [existPost] = await Post.find({ postId });
const { user } = res.locals.User;
const { title, content } = req.body;
if (user.userName !== existPost.userName) {
return res.status(401).json({ ok: false, message: '작성자가 아닙니다.' });
}
if (!title || !content) {
return res.status(400).json({ ok: false, message: '빈값을 채워주세요' });
}
await Post.updateOne({ postId }, { $set: { title, content } });
return res.status(200).json({
result: await Post.findOne({ postId }),
ok: true,
message: '게시글 수정 성공',
});
} catch (err) {
return res
.status(400)
.json({ success: false, message: '게시글 수정 에러' });
}
}
// 글 삭제
async function postDelete(req, res, next) {
try {
//#swagger.tags= ['일반 게시글 API'];
//#swagger.summary= '일반 게시글 삭제 API'
//#swagger.description='-'
const postId = Number(req.params.postId);
console.log('postId: ', postId);
const [targetPost] = await Post.find({ postId });
const { userName } = res.locals.User;
if (userName !== targetPost.userName) {
return res.status(401).json({
ok: false,
message: '작성자가 아닙니다.',
});
}
await Post.deleteOne({ postId });
return res.json({ ok: true, message: '게시글 삭제 성공' });
} catch (error) {
return res.status(400).json({
ok: false,
message: '게시글 삭제 실패',
});
}
}
async function postImage(req, res, next) {
try {
console.log('경로 정보입니다.', req.file.location);
console.log('req.body정보', req.body.title);
res.json('hi');
} catch (error) {
res.json('bye');
}
}
// router.post('/post', upload.single('image'), async (req, res) => {
async function postUpload(req, res, next) {
try {
//#swagger.tags= ['일반 게시글 API'];
//#swagger.summary= '일반 게시글 등록 API'
//#swagger.description='-'
const image = req.file.location;
console.log('--------------------------------' + image);
const { userName } = res.locals.User;
const { title, content, workSpaceName } = req.body;
const createdTime = new Date();
console.log(createdTime);
const maxpostId = await Post.findOne().sort({
postId: -1,
});
// console.log(maxpostId)
let postId = 1;
if (maxpostId) {
postId = maxpostId.postId + 1;
}
const createdPost = await Post.create({
image,
postId,
workSpaceName,
userName,
title,
content,
createdTime,
});
return res.json({
result: createdPost,
ok: true,
message: '게시물 작성 성공',
});
res.json({ result: true });
} catch (error) {
res.send({ errorMessage: error.message, success: false });
}
}
module.exports = {
postUpload,
postAllView,
postView,
postEdit,
postDelete,
postImage,
};
'개발자 학습노트 > * 학습일기*' 카테고리의 다른 글
11주차 WIL - 안된다면 또 다시 / TDD (2) | 2022.07.24 |
---|---|
10주차 WIL - 변명은 없다 / 지금까지 써본 실전 기술정리 (0) | 2022.07.17 |
스터디 운영용으로 만들어본 랜덤순서 정하기 프로그램 (nodejs) (0) | 2022.07.12 |
nodejs -스웨거( swagger ) (0) | 2022.07.12 |
9주차 WIL - 더욱 깊게 항해하라 (0) | 2022.07.10 |
Comments