티스토리 뷰
하나의 프로젝트에서 다른 서버로 proxy 전송을 하는데 첨부파일의 경우 넘어가지 않는 현상이 발생하였다.
이유는 multer를 이용하여 첨부파일을 처리하는데 미들웨어에 적용된 경우 파싱을 이미 하고 request를 보내면 받는 곳에서도 multer가 적용되어 실제로 업로드가 이루어지니 두번 파싱을 하기 때문에 proxy로 보낼 때 같이 보내지 못하는 것이다.
그래서 특정 url의 경우 첫번째 받는곳에서 multer를 제외시켜줘야 했고 proxy middleware를 만들어 정상적으로 proxy를 보낼 때 첨부파일을 보내는 작업이 필요했다.
multer middleware 제외 처리
// multer 미들웨어 제외 예외처리
const EXCLUDE_URL = ['/v2/test/create', '/v2/test/update'];
const shouldParseRequest = req => _.includes(EXCLUDE_URL, req.url) === false;
const fnMulter = multer({ dest: `${config.root}/server/uploads` });
// 기존
app.use(multer({ dest: `${config.root}/server/uploads` }));
// 수정
app.use((req, res, next) => shouldParseRequest(req) ? fnMulter(req, res, next) : next());
proxyMiddleware
- Router에서 bdoyparse를 제외하고, rquest 객체 그대로 proxy를 태워야 한다.
const proxy = require('express-http-proxy');
/**
* multipart request 검사
* @param {Object} req - request object
* @returns {Boolean}
*/
const isMultipartRequest = (req) => {
const contentTypeHeader = req.headers['content-type'];
return contentTypeHeader && contentTypeHeader.indexOf('multipart') > -1;
};
/**
* request delete method
* @param {String} host - server host
* @param {String} proxyUrl - proxy 전달할 url
* @returns {Object}
*/
const proxyMiddleware = (host, proxyUrl) => (req, res, next) => proxy(host, {
reqAsBuffer: false,
reqBodyEncoding: true,
parseReqBody: false, // bodyParser 를 거치지 않도록 하기 위해
timeout: 60000,
filter(srcReq) {
return isMultipartRequest(srcReq);
},
proxyReqPathResolver(srcReq) {
return proxyUrl;
},
proxyReqOptDecorator(proxyReqOpts) {
// 헤더 추가
// proxyReqOpts.headers['server-key'] = '';
proxyReqOpts.headers.user = req.user._id;
return proxyReqOpts;
},
})(req, res, next);
proxyMiddleware를 만들고나서 router 부분에 위의 미들웨어를 호출
router.put('/update', request.proxyMiddleware(waitingsServer.url, '/v2/test/update'));
정상적으로 proxy를 태울 때 첨부파일을 전송한다.
'Node.js' 카테고리의 다른 글
Promise All (0) | 2019.09.25 |
---|---|
NVM설치 및 기본 사용 방법 (0) | 2019.08.14 |
댓글