NodeJS 中的 HTTP 代理伺服器

Isaac Tony 2023年1月30日 2022年5月13日
  1. 在 NodeJS 中使用 HTTP-Proxy 中介軟體建立一個簡單的 HTTP 代理
  2. 在 NodeJS 中使用 required() 方法將我們的依賴項匯入到我們的主檔案中
  3. 在 NodeJS 中使用代理伺服器使用代理伺服器重寫路徑
  4. 在 NodeJS 中使用 curl 工具測試代理伺服器和端點
NodeJS 中的 HTTP 代理伺服器

代理伺服器是位於提供資源的伺服器和客戶端之間的中間伺服器。

代理伺服器可以用於最基本的伺服器和客戶端之間的未修改代理事務。

這些伺服器是閘道器或隧道代理,通常被歸類為轉發。

此外,用作匿名代理,允許使用者匿名瀏覽。我們還有一個反向代理伺服器,一種提供附加服務的代理伺服器。

這些伺服器的目的是通過提供負載平衡等服務來提高效能、提供安全性並提高可靠性。

反向代理還可以通過保護使用者免受 DDoS 攻擊、代表主伺服器執行 SSL 加密和快取內容等攻擊來為使用者提供額外的安全性。

在 NodeJS 中使用 HTTP-Proxy 中介軟體建立一個簡單的 HTTP 代理

他的文章將介紹如何使用 HTTP-proxy 中介軟體在 NodeJS 中建立一個簡單的 HTTP 代理。首先,我們需要建立一個新的 NodeJS 專案並對其進行初始化。

npm init

請記住,你必須在系統上安裝 NodeJS 和 npm 才能正常工作。

該命令將允許我們生成一個 package.json 檔案,該檔案將包含程式中使用的依賴項、作者姓名和許可證。

一旦我們設定好這個基本程式,我們就可以安裝 express js 和 http-proxy 中介軟體。Express js 是一個極簡主義的 Web 框架,我們可以在不掩蓋 NodeJS 特性的情況下使用它。

Http-proxy 是一個單線 node.js 代理中介軟體,用於連線、表達和瀏覽器同步。我們可以使用下面的命令安裝它們。

npm install express
npm install npm install --save-dev http-proxy-middleware

執行上面的命令將它們作為依賴項新增到下面的 package.json 檔案中。

{
  "name": "proxyy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "isaac tonyloi",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.2"
  },
  "devDependencies": {
    "http-proxy-middleware": "^2.0.2",
    "install": "^0.13.0",
    "npm": "^8.4.0"
  }
}

在 NodeJS 中使用 required() 方法將我們的依賴項匯入到我們的主檔案中

我們將首先使用下面所示的 required() 方法將我們的依賴項匯入我們的主檔案 index.js

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

然後,我們將建立一個簡單的快速伺服器來偵聽埠 8080 和一個代理伺服器,它允許我們將請求映象到目標站點的相應路徑。

在此示例中,我們將使用 dummyapi.io 作為目標站點。Dummy API 是一個偽造的資料沙箱 API,它允許我們使用真實和偽造的使用者資料。

類似於 jsonplaceholder,但為 REST 資料 API 端點和 GraphQL API 和更多功能提供介面。

在將其傳送到目標伺服器之前,我們可以使用此代理對我們的路徑進行各種更改。例如,我們可以重寫、刪除基本路徑或新增到路徑中。

在 NodeJS 中使用代理伺服器使用代理伺服器重寫路徑

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();
const PORT = 8080;

const API_SERVICE_URL = "https://dummyapi.io";

app.use('/user_info', createProxyMiddleware({
    target: API_SERVICE_URL,
    changeOrigin: true,
    pathRewrite: {
        [`^/user_info`]: '',
    },
}));

app.listen(PORT, () => {
    console.log(`Proxy server listening at port number:${PORT}`);
});

我們可以通過在終端上執行命令 node index.js 來啟動伺服器。

輸出:

[HPM] Proxy created: /  -> https://dummyapi.io
[HPM] Proxy rewrite rule created: "^/user_info" ~> ""
Proxy server listening at port number:8080

現在,如果我們向端點 localhost:8080/user_info/data/v1/user/60d0fe4f5311236168a109ca 傳送請求,代理伺服器將將此路徑重寫為 https://dummyapi.io/data/v1/user/60d0fe4f5311236168a109ca

在 NodeJS 中使用 curl 工具測試代理伺服器和端點

我們可以使用 curl 工具來測試這些端點並檢視我們的代理伺服器的工作情況。請注意,我們還在請求中新增了一個包含 app-id 的標頭,如下所示。

curl -H "app-id: 61fcc16fcc2b30f8f01dfdb5" localhost:8080/user_info/data/v1/user/60d0fe4f5311236168a109ca
{"id":"60d0fe4f5311236168a109ca","title":"ms","firstName":"Sara","lastName":"Andersen","picture":"https://randomuser.me/api/portraits/women/58.jpg","gender":"female","email":"sara.andersen@example.com","dateOfBirth":"1996-04-30T19:26:49.610Z","phone":"92694011","location":{"street":"9614, Søndermarksvej","city":"Kongsvinger","state":"Nordjylland","country":"Denmark","timezone":"-9:00"},"registerDate":"2021-06-21T21:02:07.374Z","updatedDate":"2021-06-21T21:02:07.374Z"}

我們已經成功建立了一個 http 代理伺服器,它可以重定向和修改對特定服務的請求。

除此之外,我們還可以使用此代理伺服器作為身份驗證中介軟體對我們的請求進行授權。

這確保只有授權使用者才能訪問特定服務。下面是真實軟體的簡單實現;我們通常有更復雜的授權。

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');

const app = express();
const PORT = 8080;

const service_endpoint = "https://dummyapi.io";

app.use('', (req, res, next) => {
    if (req.headers.authorization) {
        next();
    } else {
        res.sendStatus(403);
    }
 });

app.use('/user_info', createProxyMiddleware({
    target: service_endpoint,
    changeOrigin: true,
    pathRewrite: {
        [`^/user_info`]: '',
    },
}));

app.listen(PORT, () => {
    console.log(`Proxy server listening at port number:${PORT}`);
});

為了測試我們的代理伺服器是否授權我們的請求,我們可以向端點傳送請求而不包含授權資訊。這將返回一個錯誤,如下所示。

>curl -H "app-id: 61fcc16fcc2b30f8f01dfdb5" localhost:8080/user_info/data/v1/user/60d0fe4f5311236168a109ca

輸出:

Forbidden

這意味著我們的授權中介軟體正在工作,我們需要將憑證傳遞到標頭中才能訪問服務。

curl -H "app-id: 61fcc16fcc2b30f8f01dfdb5" -H "Authorization: isaactonyloi" localhost:8080/user_info/data/v1/user/60d0fe4f5311236168a109ca
{"id":"60d0fe4f5311236168a109ca","title":"ms","firstName":"Sara","lastName":"Andersen","picture":"https://randomuser.me/api/portraits/women/58.jpg","gender":"female","email":"sara.andersen@example.com","dateOfBirth":"1996-04-30T19:26:49.610Z","phone":"92694011","location":{"street":"9614, Søndermarksvej","city":"Kongsvinger","state":"Nordjylland","country":"Denmark","timezone":"-9:00"},"registerDate":"2021-06-21T21:02:07.374Z","updatedDate":"2021-06-21T21:02:07.374Z"}
E:\>curl -H "app-id: 61fcc16fcc2b30f8f01dfdb5" localhost:8080/user_info/data/v1/user/60d0fe4f5311236168a109ca
Author: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn