항해 26 (2nd 미니프로젝트 Back-end 코드리뷰)

전은규·2021년 10월 15일
0

항해

목록 보기
32/50

app.js

const swaggerUi = require('swagger-ui-express');
const swaggerFile = require('./swagger_output.json');

//스웨거 자동생성을 위한 코드
//스웨거 아웃풋파일 저장 위치

app.use('/swagger', swaggerUi.serve, swaggerUi.setup(swaggerFile));

//주소창 localhost:port/swagger 로 스웨거 편집기 실행

const cors = require('cors');//cors!! 프론트에서 접근 할때 허용하기 위한 설정

//cors!! 프론트에서 접근 할때 허용하기 위한 설정

swagger.js

const outputFile = './swagger_output.json';
const endpointsFiles = ['./app.js'];
swaggerAutogen(outputFile, endpointsFiles, doc)

//swaggerAutogen으로 outputfile 파일을 app.js 루트로 api 들을 생성한다.
이때 명령어는 터미널에서 node swagger.js

router_posts.js

const multer = require('multer');
const multerS3 = require('multer-s3');
const AWS = require('aws-sdk');

//form data 처리를 할수 있는 라이브러리 multer
// aws s3에 파일을 처리 할수 있는 라이브러리 multer-s3
//javascript 용 aws 서비스 사용 라이브러리

AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2', // 한국
});

//보안자격증명 액세스 키 설정해야 s3 bucket 접근이 가능하다.

 const upload = multer({
 
  storage: multerS3({
    //multer의 storage옵션을 multers3로 교체
    s3: new AWS.S3(),
    bucket: 'stravinestbucket', //bucket 이름
    key(req, file, cb) {
      cb(null, `original/${Date.now()}${path.basename(file.originalname)}`);
    }, //저장할 파일명 설정 버킷 내부에서 oroginal 폴더 아래에 생성됨
    acl: 'public-read-write', //읽기 쓰기 접근가능
  }),
  limits: { fileSize: 5 * 1024 * 1024 }, //최대 사이즈 5mb
});
 //게시글 등록 formdata 방식으로 받아오는 api
router.post(
  '/post',
  // authMiddleware,
  upload.single('image'), //upload(multer) api요청 주소로 formdata 형식으로 name 이 이미지로 1개 온것을 받는다.
  //formdata 안에 파일 말고 다른 정보는 body로 들어온다.
  async (req, res) => {
    try {
      //const { userId } = res.locals.user; //로그인 정보에서 가져온다.
      const userId = 'stravinest';
      const { title, content } = req.body; //formdata로 같이 넘어옴
      if (req.file) {
        //파일이 있으면 즉 image가 넘어오면
        const originalUrl = req.file.location; //s3 bucket이미지 주소가 들어있다. //프론트에서 쓸수 있음
        //람다 리사이징 과정
        //새로운 폴더를 만들어서 sharp 라이브러리를 이용해서 리사이징하는 코드를 짠다.
        //sharp 는 윈도우용 맥용 리눅스 용이 있는데 자동적으로 개발환경에 따라 깔린다.
        //우리가 사용할 람다는 리눅스용 이므로 배포환경 EC2 or lightsail에서 배포 해야 한다.
        //따라서 나의경우 EC2 ssh 에 접속해서 리사이징 코드를 받아온다 (받아오는 방법은 github를 이용)
        //git 에서 클론을 받고 npm i 까지 한후 압축 해서 aws-cli 를 이용해 업로드 한다.
        //업로드 후에 aws 사이트에서 람다메뉴에서 함수 생성을 하면 됨

        const resizeUrl = originalUrl.replace(/\/original\//, '/thumb/');
        //리사이즈 된 파일 주소 설정
        await Posts.create({ userId, title, content, image: originalUrl });

        //  res.status(200).send({ result: '게시글 작성에 성공하였습니다.' });
        res.json({ resizeUrl, originalUrl });
      } else {
        console.log('이미지 파일이 없습니다.');
        res.status(400).send({ errorMessage: '이미지파일이 없습니다.' });
      }
    } catch (error) {
      console.log(`${req.method} ${req.originalUrl} : ${error.message}`);
      res.status(401).send({ errorMessage: '게시글 작성에 실패하였습니다.' });
    }
  }
);
profile
성장하는개발자

0개의 댓글