Express를 사용하여 자신만의 역방향 프록시 구축

지금 http://jauyeung.net/subscribe/에서 내 이메일 목록을 구독하십시오.

Twitter에서 나를 팔로우하세요.

https://medium.com/@hohanga에서 더 많은 기사

분산 시스템에 마이크로서비스 아키텍처를 사용하는 경우 API 게이트웨이가 필요합니다. API 게이트웨이를 구축하는 좋은 방법 중 하나는 역방향 프록시를 사용하는 것입니다. Node.js은 빠르고 리버스 프록시를 만들기 위한 라이브러리가 많기 때문에 리버스 프록시에 좋습니다.

Express는 웹 앱을 구축하는 데 가장 널리 사용되는 프레임워크입니다. 역방향 프록시에 대한 라우팅을 수행할 수 있는 Express에 추가 기능이 있기 때문에 역방향 프록시를 구축하는 데에도 매우 좋습니다.

디자인은 매우 간단할 것입니다. 요청의 URL에 따라 트래픽을 다른 백엔드 앱으로만 리디렉션합니다. 또한 요청 페이로드 외에도 헤더 데이터, 파일 및 쿠키를 당사 서비스에 전달할 수 있어야 합니다.

이 모든 작업을 수행하기 위해 먼저 https://expressjs.com/en/starter/generator.html의 지침에 따라 Express 애플리케이션 생성기를 실행하여 앱을 스캐폴딩합니다.

필요한 코드를 생성하려면 npx express-generator를 실행해야 합니다.
nodemon를 사용하여 개발 환경에서 앱을 실행하여 코드가 변경될 때마다 다시 시작하도록 제안합니다.

다음으로 역방향 프록시 기능을 수행하고 프런트 엔드 앱이 역방향 프록시를 사용할 수 있도록 CORS를 활성화하기 위해 일부 패키지를 설치해야 합니다. 이렇게 하려면 npm i express-http-proxy glob node-env-file cookie-parser babel-register body-parser 를 실행하십시오.
express-http-proxy는 HTTP 역방향 프록시 라이브러리입니다. cors는 CORS를 활성화하는 Express용 애드온입니다. cookie-parser는 Express가 쿠키를 구문 분석할 수 있도록 하는 추가 기능입니다. babel-register를 사용하면 최신 JavaScript 기능을 사용할 수 있습니다. node-env-file를 사용하면 .env 파일을 사용하여 환경 변수를 저장할 수 있습니다. body-parser는 멀티파트 요청을 확인하는 데 사용됩니다. 멀티파트 요청은 파일이 있는 요청입니다. 파일이 있는 요청은 리디렉션되기 전에 진행되지 않습니다body-parser.

이제 코드를 작성할 준비가 되었습니다. 생성한 helper.js 폴더에 helpers라는 새 파일을 만듭니다.

거기에 다음을 추가합니다.

module.exports = {  
    isMultipartRequest: (req) => {  
        let contentTypeHeader = req.headers['content-type'];  
        return contentTypeHeader && contentTypeHeader.indexOf('multipart') > -1;  
    }  
}

이 함수는 양식 데이터로 전송되는 요청인 멀티파트 요청을 확인합니다. 여기에는 텍스트나 파일이 포함될 수 있습니다.
app.js 에서 다음과 같이 씁니다.

require("babel-register");  
let express = require('express');  
let cors = require('cors')  
let config = require('./config/config');  
let env = require('node-env-file');  
let helpers = require('./app/helpers/helpers');  
let bodyParser = require('body-parser');  
env(__dirname + '/.env');
let app = express();

app.use(cors({  
  credentials: true,  
  origin: true  
}));

const bodyParserJsonMiddleware = function () {  
  return function (req, res, next) {  
    if (helpers.isMultipartRequest(req)) {  
      return next();  
    }  
    return bodyParser.json()(req, res, next);  
  };  
};

app.use(bodyParserJsonMiddleware());

app.all('*', (req, res, next) => {  
  let origin = req.get('origin');  
  res.header('Access-Control-Allow-Origin', origin);  
  res.header("Access-Control-Allow-Headers", "X-Requested-With");  
  res.header('Access-Control-Allow-Headers', 'Content-Type');  
  next();  
});

module.exports = require('./config/express')(app, config);

app.listen(config.port, () => {  
  console.log('Express server listening on port ' + config.port);  
});

이 코드는 서버 측 쿠키를 전달하여 작동하며 JSON이 아니기 때문에 멀티파트 요청이 통과하지 못하도록 합니다body-parser.

또한 아래 블록에서 CORS를 허용합니다.

app.all('*', (req, res, next) => {  
  let origin = req.get('origin');  
  res.header('Access-Control-Allow-Origin', origin);  
  res.header("Access-Control-Allow-Headers", "X-Requested-With");  
  res.header('Access-Control-Allow-Headers', 'Content-Type');  
  next();  
});

모든 출처의 요청을 수락할 수 있습니다. 기본적으로 다른 호스트의 요청을 허용하는 것은 안전하지 않으므로 백엔드와 동일한 호스트의 요청만 수락됩니다. 그러나 모바일 및 독립 실행형 프론트 엔드 웹 앱이 역방향 프록시를 통해 요청하도록 허용하는 경우 모든 출처를 허용해야 합니다. 헤더에서 오리진을 가져오고 해당 오리진의 요청이 계속 진행되도록 허용합니다.

그런 다음 controllers/home.js에 요청을 프록시하기 위한 코드를 추가합니다.

const express = require('express');  
let proxy = require("express-http-proxy");  
let helpers = require('../helpers/helpers');
let loginAppRoutes =[  
  '/login*',  
  '/loginms',  
  '/register',  
  '/resetPassword',  
  '/getActivationKey*',  
  '/activateAccount',  
  '/logout',  
  '/reports',  
  '/'  
]

let uploadRoutes = [  
  '/uploadlogo*',  
]

module.exports = (app) => {  
  const proxyMiddleware = () => {  
    return (req, res, next) => {  
      let reqAsBuffer = false;  
      let reqBodyEncoding = true;  
      let contentTypeHeader = req.headers['content-type'];  
      if (helpers.isMultipartRequest(req)) {  
        reqAsBuffer = true;  
        reqBodyEncoding = null;  
      }  
      return proxy(process.env.UPLOAD_URL, {  
        reqAsBuffer: reqAsBuffer,  
        reqBodyEncoding: reqBodyEncoding,  
        parseReqBody: false,  
        proxyReqOptDecorator: (proxyReq) => {  
          return proxyReq;  
        }, 

        proxyReqPathResolver: (req) => {  
          return `${process.env.UPLOAD_APP_URL}/${req.baseUrl}${req.url.slice(1)}`;  
        }, 

        userResDecorator: (rsp, data, req, res) => {  
          res.set('Access-Control-Allow-Origin', req.headers.origin);  
          return data.toString('utf-8');  
        }  
      })(req, res, next);  
    };  
  } 

  uploadRoutes.forEach(r => {  
    app.use(r, proxyMiddleware());  
  }) 

  loginAppRoutes.forEach(r => {  
    app.use(r, proxy(process.env.LOGIN_URL, {  
      proxyReqOptDecorator: (proxyReq) => {  
        return proxyReq;  
      },

      proxyReqPathResolver: (req) => {  
        return `${process.env.LOGIN_URL}/${req.baseUrl}${req.url.slice(1)}`;  
      }, 

      userResDecorator: (rsp, data, req, res) => {  
        res.set('Access-Control-Allow-Origin', req.headers.origin);  
        return data.toString('utf-8');  
      }  
    }));  
  })  
};

다음을 사용하여 여러 부분으로 구성된 양식 요청을 확인합니다.

if (helpers.isMultipartRequest(req)) {  
  reqAsBuffer = true;  
  reqBodyEncoding = null;  
}

파일이 포함된 요청을 내부 API로 바로 전달합니다.

다음과 같은:

proxyReqPathResolver: (req) => {  
  return `${process.env.LOGIN_URL}/${req.baseUrl}${req.url.slice(1)}`;  
},

프록시에서 내부 API로의 실제 리디렉션 URL이 설정되는 곳입니다. parseReqBodyfalse 이므로 멀티파트 양식 요청이 JSON으로 구문 분석되지 않습니다.
process.env 변수는 .env 파일에 설정되어 있습니다.
.env 파일에는 다음이 있습니다.

LOGIN_URL='http://urlForYourLoginApp'  
UPLOAD_URL='http://anotherUrlForYourUploadApp'

역방향 프록시 추가 기능을 사용하는 Express는 Node.js에서 역방향 프록시를 구축하기 위한 최상의 선택 중 하나입니다.

좋은 웹페이지 즐겨찾기