-
nodeJs] 첨부 파일를 다른 서버로 전달하기NodeJS 2020. 7. 11. 22:49728x90
첨부파일을 다른 서버로 포워딩 하기
첨부 파일을 아래 그림과 같이 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 가 발생합니다.
파일을 전달하는 것이 어려운게 아닌데 명확한 인터페이스를 확인하지 못해서 시간이 많이 지체 되었습니다.
728x90'NodeJS' 카테고리의 다른 글
Nodejs에서 Typescript 사용해보기! (0) 2020.07.14 swagger-node에서 express-session 설정 & 사용하기 (0) 2020.07.13 PM2 save / startup을 해두어도, reboot 시 실행되지 않을시 처리 방안 (0) 2020.06.12 swagger-node + mongoose 예제 (0) 2020.06.09 JAVA 개발자가 시작하는 NodeJS (0) 2020.06.08