본문 바로가기

개발자의 logs

nodejs multer s3에 연결하기 소스코드 source code 본문

개발자 학습노트/* 학습일기*

nodejs multer s3에 연결하기 소스코드 source code

주인장v 2022. 7. 15. 16:19

실전 팀작업을 하던 중 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,
};
Comments