Express를 사용하여 자신만의 역방향 프록시 구축
                                            
                                                
                                                
                                                
                                                
                                                
                                                 25685 단어  tutorialwebdevjavascriptnode
                    
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이 설정되는 곳입니다.
parseReqBody 는 false 이므로 멀티파트 양식 요청이 JSON으로 구문 분석되지 않습니다.process.env 변수는 .env 파일에 설정되어 있습니다..env 파일에는 다음이 있습니다.LOGIN_URL='http://urlForYourLoginApp'  
UPLOAD_URL='http://anotherUrlForYourUploadApp'
역방향 프록시 추가 기능을 사용하는 Express는 Node.js에서 역방향 프록시를 구축하기 위한 최상의 선택 중 하나입니다.
Reference
이 문제에 관하여(Express를 사용하여 자신만의 역방향 프록시 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aumayeung/build-your-own-reverse-proxy-with-express-4da4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)