첨부파일을 다른 서버로 포워딩 하기
첨부 파일을 아래 그림과 같이 API server에서 받아서 다른 내부 서버에 전달을 하려고 합니다.
API 서버에는 따로 첨부파일 정보를 저장하지 않고, buffer를 바로 내부 서버로 전달을 합니다.
이를 처리하는 방식으로는 2가지가 있습니다.
- Proxy 사용
- axios와 다른 라이브러리를 이용하여 post 통신
1. Proxy 사용
필요 라이브러리
사용법
express-http-proxy를 다음과 같이 설정하면 해당 주소로 오는 요청의 통신을 설정된 서버로 포워딩 해줍니다.
# 예제
const proxy = require('express-http-proxy');
const app = require('express')();
app.use('/proxy', proxy('http://proxy_target_domain', {
proxyReqPathResolver: async (req) => {
return '/proxy/target/url?id='+req.params.id;
},
proxyReqOptDecorator: (proxyReqOpts) => {
const newProxyReqOpts = { ...proxyReqOpts };
newProxyReqOpts.headers = { host: 'spacial hosts', apikey: 'spacial key' };
newProxyReqOpts.rejectUnauthorized = false;
return newProxyReqOpts;
},
}));
2. axios와 다른 라이브러리를 이용하여 post 통신
필요 라이브러리
사용법
우선 첨부파일을 multer를 이용해서 객체로 만들고, 이를 form-data로 감싸서 axios를 통해 전송합니다.
const axios = require("axios");
const https = require("https");
const multer = require("multer");
const FormData = require("form-data");
const express = require('express');
const app = express();
const router = express.Router();
app.use('/', router);
const upload = multer();
router.post(
"/upload",
upload.single("filepond"), // multer를 이용하여 업로드 파일 처리
async (req, res, next) => {
try {
// buffer를 FormData로 감쌈
const formData = new FormData();
formData.append("filepond", req.file.buffer, {
filename: req.file.originalname,
});
// 다른 서버로 전송
const result = await axios.post(
'http://proxy_target_domain/proxy/target/url',
formData,
{
headers: {
...formData.getHeaders(),
"Content-Length": formData.getLengthSync(),
apikey: "apikey",
host: "hosts",
},
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
}
);
res.status(200).json(result.data);
} catch (err) {
logger.error(err);
res
.status(500)
.send(`${err}`);
}
}
);
첨부 파일을 다른 서버로 전송할때 주의 하는 부분이 있습니다.
formData.append("filepond", req.file.buffer, {
filename: req.file.originalname,
});
이 부분에서 3번째 옵션 파라메터에 filename 이외의 값을 함부로 추가 하면 400 Bad request 가 발생합니다.