자! 열심히 알아봤다. 이제 받아져야지? 라고 생각한 나의 실수였다. 계속해서 데이터가 넘어오지 않았다. 여기서 삽질 또 시작.
문제는 프론트의 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에서 아무리 덮어씌어도 안바뀌더라.