使用 express 輕鬆實現反向代理服務器

遇到的問題

開發的時候遇到的一個問題,就是後臺API和前端頁面分開開發,可是開發的時候並不想在本地搭建後端環境,由於特別麻煩!特別麻煩!特別麻煩!好比說要配置運行環境、裝數據庫還有服務器。亂七八糟,有時候光是弄環境就要弄一天。但是若是不配置又沒辦法開發。最主要的是請求後端API的時候會遇到跨域問題。最簡單的方法固然是後端幫忙配一個CORS。可是若是後端沒辦法配合的話,可能就比較麻煩了。這時候可使用反向代理進行開發。javascript

正向代理與反向代理

首先科普一下代理,代理分爲正向代理和反向代理前端

  • 正向代理
正向代理,意思是一個位於客戶端和原始服務器 (origin server) 之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標 (原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端才能使用正向代理。
--摘自百度百科
  • 反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。
--摘自百度百科

二者的主要區別在於代理的對象不同: 正向代理代理的對象是客戶端,反向代理代理的對象是服務端。
而咱們遇到的問題就是須要使用反向代理解決。java

開始擼代碼

說到反向代理第一反應確定是Nginx。確實Nginx作反代確實很好,可是說實話,不必特地爲了作個API的代理裝個Nginx。並且還要去學習Nginx的配置。
另外,可能會想到webpack,固然若是你使用了webpack,直接就可使用webpack-dev-server了。
但若是你手頭上接手了一個老項目就比較尷尬了。下面進入正題使用express作開發代理服務器。node

首先安裝expresshttp-proxy-middlewareconnect-timeout(此模塊用於處理超時):webpack

npm install --save-dev express http-proxy-middleware connect-timeout
## 若有問題,則能夠嘗試使用下面的代碼進行安裝
npm install --save-dev express@4.16.2 http-proxy-middleware@0.17.4 connect-timeout@1.9.0
express是基於 Node.js 平臺,快速、開放、極簡的 web 開發框架。
http-proxy-middleware 是專門用於 http 代理的一個 node 中間件,適用於 connect, express, browser-sync 等等,由熱門的 http-proxy 驅動。

以後新建一個proxy-server.js文件。web

const express = require('express');
const timeout = require('connect-timeout');
const proxy = require('http-proxy-middleware');
const app = express();

// 這裏從環境變量讀取配置,方便命令行啓動
// HOST 指目標地址
// PORT 服務端口
const { HOST = 'http://10.10.0.21:9080', PORT = '3300' } = process.env;

// 超時時間
const TIME_OUT = 30 * 1e3;

// 設置端口
app.set('port', PORT);

// 設置超時 返回超時響應
app.use(timeout(TIME_OUT));
app.use((req, res, next) => {
  if (!req.timedout) next();
});

// 靜態頁面
// 這裏通常設置你的靜態資源路徑
app.use('/', express.static('static'));

// 反向代理(這裏把須要進行反代的路徑配置到這裏便可)
// eg:將/api/test 代理到 ${HOST}/api/test
app.use(proxy('/api/test', { target: HOST }));

// 監聽端口
app.listen(app.get('port'), () => {
  console.log(`server running @${app.get('port')}`);
});

啓動數據庫

node proxy-server.js

而後再瀏覽器中打開http://localhost:3300便可express

動態設置端口和反向代理地址npm

HOST=http://10.0.1.10:8081 PORT=3301 node proxy-server.js

此時則須要在http://localhost:3301進行訪問。
至此,一個簡單可用的開發環境就搞定了。segmentfault

理論介紹參考:
反向代理爲什麼叫反向代理?
正向代理與反向代理的淺解

相關文章
相關標籤/搜索