자! 열심히 알아봤다. 이제 받아져야지? 라고 생각한 나의 실수였다. 계속해서 데이터가 넘어오지 않았다. 여기서 삽질 또 시작.
문제는 프론트의 axios에 있었다. axios를 사용하면 받아지지 않았지만 아래의 코드를 사용하니 값이 넘어왔다.
var req = new XMLHttpRequest()
var file = new Blob(['This is a test'], { type: 'text/plain' })
var data = new FormData()
data.append('photo', file, 'test.txt')
req.open('POST', '/upload')
req.send(data)
3. 저장 폴더를 유동적으로 바꾸기
난 aws s3에 이미지 파일을 저장해야했기 때문에 multer-s3도 사용했다.
multer의 구조는 좀 이상했다. 프론트로 받은 데이터를 기반으로 이미지가 저장될 폴더를 만들고 싶었지만
app.post('/image', s3.upload.single('avatar'), function (req, res, next) {})
이렇게 req로 받기도 전에 파일에 저장을 때리는데 어떻게 하란 말인가...
그래서 아래와 같은 방법으로 파일명을 고쳐보기로 했다.
/* router file */
const express = require('express');
const router = express.Router();
const ctrl = require('../api/c_board');
const multer = require("multer");
const {new_s3_storage} = require("../utils/u_s3_storage");
// s3를 빈 값으로 선언했더니 아래 라우터에서 빈 값에
// array() 함수가 없다고 에러가 떠서 저장 폴더가 고정된 s3객체를 넘겨줬다
let s3 = require("../utils/u_s3");
// 해당 middleware부터 먼저 실행되고 아래 /image가 실행된다
router.use('/image', (req, res, next) => {
// 프론트로부터 받은 데이터
var bo_id = req.headers.bo_id;
// 데이터를 매개변수로 넘겨 새로운 s3 storage 객체 생성
var s3_storage = new_s3_storage(bo_id);
// 기존 s3에 새로만들어진 s3 storage로 덮어준다
s3 = multer({ storage : s3_storage });
next();
})
router.post('/image', s3.array('img'), ctrl.image);
module.exports = router;
middleware를 사용해서 /image로 들어가기 전에 header 값으로 프론트로부터 받은 데이터(req.headers.bo_id)로 새로운 storage 객체를 만들어 s3에 덮어씌울 계획이었다.
결과는 실패!
let s3 = require("../utils/u_s3"); 값이 middleware에서 아무리 덮어씌어도 안바뀌더라.
프로젝트를 하면서 서버 개발은 PHP를 기반으로 하는 프레임워크인 Laravel을 가장 많이 사용했다.
이번에 새로운 프로젝트를 진행하면서 Laravel 대신 Nodejs를 사용하게 되었다.
서버의 제일 기본적인 역할은 DB를 탐색하여 프론트에서 요청하는 사항에 맞게 데이터를 돌려주는 역할이다. Laravel은 컨트롤러에서 쉽게 쿼리문을 DB에 보내 탐색할 수 있다. 하지만 Nodejs는 'Sequelize' 라는 라이브러리를 사용하여 MySQL에 접근해야 한다.
즉, 'Sequelize'를 사용하면 자바스크립트 코드로 MySQL을 제어할 수 있게 된다.
이론적인 자세한 내용은 나도 오늘 처음 만져보기에 모른다. 어떻게 사용하는지에 대해 차근차근 알아보자!
시작하기 전 준비물!
1. Nodejs 2. MySQL
1. sequelize-cli 를 설치해주자.
> npm i sequelize mysql2
> npm i -g sequelize-cli
i 는 install 의 약자이고 둘 다 사용해도 문제없다. -g 는 sequelize-cli 를 전역에 설치한다는 의미로 설치를 마치고 아무 커맨드 창에서나 sequelize 를 호출할 수 있다.
2. sequelize 를 프로젝트 폴더에 설치하자.
> sequelize init
위 명령어를 입력했지만 "이 시스템에서 스크립트를 실행할 수 없으므로 파일을 로드할 수 없습니다" 이렇게 뜰 수도 있다. 권한에 맞지 않는 실행이으로 뜨는 에러다.
만약 위 설명과 같은 문제가 생긴다면 아래의 코드를 입력해주자.
> Set-ExecutionPolicy RemoteSigned
그리고 다시 sequelize init 를 입력하면 config, models, migrations, seeders 폴더가 생성된다.