搜尋
首頁web前端js教程node和express搭建代理伺服器的方法介紹
node和express搭建代理伺服器的方法介紹Jan 11, 2019 am 11:33 AM
expressnode.js

這篇文章帶給大家的內容是關於node和express搭建代理伺服器的方法介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

本範例用node和express搭建的代理伺服器。 ,期望目標如下:

1、開啟某服務A,該服務可實現若干功能,例如普通的restful請求,文件上傳,靜態資源存取等等。

2、開啟node代理服務B,指向服務A,存取代理服務B,可存取服務A的任意功能。

就如下圖所示:

node和express搭建代理伺服器的方法介紹

#圖中上半部是直接存取服務,下班部分是透過代理伺服器訪問服務。

使用代理伺服器時,瀏覽器向代理伺服器請求數據,代理伺服器轉發請求,並將接收到的資料傳回瀏覽器,即所有的資料都透過代理伺服器轉送。
帶著這個目標,我們就講述下如何實現該功能。

既然是請求和回應轉發,那我們就了解一下,什麼是請求。

請求和回應簡述

http請求和回應主要右封包頭部、空白行和封包主體三個部分組成。

空行我們不用關心,其實對我們來說,只要完成封包頭部和封包主體的轉發,就可以說實現了代理功能。

請求和回應通過代理的整個過程如下:

1、代理伺服器接收請求後,在將目標服務資料回傳給瀏覽器前要保持請求。

2、提取請求路徑、請求頭、請求主體等資料。

3、以2中擷取的資料為參數,向目標伺服器發送請求。

4、接收目標伺服器回傳數據,提取回應頭,回應主體等資料。

5、將4中的提取出來的資料回傳給客戶端(瀏覽器)。

6、斷開連線。

經過這幾個步驟,就實作了代理。

程式碼實作

下面直接上程式碼,然後做一些講解。代理函數如下:

const http = require('http');
const querystring = require('querystring');

//获取请求的cookie和query等
let getHeader = (reqClient) => {
    let headers = reqClient.headers; 
    headers.path = reqClient.path;
    headers.query = reqClient.query;
    headers.cookie = reqClient.get('cookie') || '';

    return headers;
}

//代理函数,options是代理设置,包括目标服务器ip,port等
let proxy = (options) => {
    let reqOptions = {
        hostname: options.host,
        port: options.port
    }
    //返回请求处理函数,reqClient浏览器的请求,resClient是响应浏览器的对象
    return function (reqClient, resClient) {
        //设置目标服务器的请求参数,头中的各项参数
        let headers = getHeader(reqClient);
        reqOptions.headers = reqClient.headers;
        let query = [];
        if (headers.query) {
            Object.keys(headers.query).map(key => {
                query.push(key + '=' + headers.query[key]);
            });
            reqOptions.path = headers.path + (query.length === 0 ? '' : ('?' + query.join('&')));
            
        }
        reqOptions.cookie = headers.cookie;
        reqOptions.method = reqClient.method;
        //向目标服务器发送请求,reqProxy是向目标服务器的请求,resProxy是目标服务器的响应。
        let reqProxy = http.request(reqOptions, (resProxy) => {
            resProxy.setEncoding('utf8');
            //设置返回http头
            resClient.set(resProxy.headers);
            resClient.status(resProxy.statusCode);
            //接收从目标服务器返回的数据
            resProxy.on('data', (chunk) => {
                //接收目标服务器数据后,以流的方式向浏览器返回数据
                resClient.write(chunk);
            });

            //接收目标服务器数据结束
            resProxy.on('end', () => {
                //向浏览器写数据结束。
                resClient.end();
            });
            //目标服务器响应错误
            resProxy.on('error', () => {
                //响应错误,结束向浏览器返回数据
                resClient.end();
            });
        });

        //接收浏览器数据
        reqClient.on('data', (chunk) => {
           //以流的方式向目标服务器发送数据
            reqProxy.write(chunk);
        });
        //接收数据结束
        reqClient.on('end', () => {
          //向目标服务器写数据结束
            reqProxy.end();
        });
        
        //普通JSON数据代理
         if (Object.keys(reqClient.body).length) {
             reqProxy.write(querystring.stringify(reqClient.body));
             reqProxy.end();
         }
    }
}

module.exports = proxy;

上面就是node代理的核心程式碼。支援普通的請求,靜態資源代理,文件上傳下載代理等功能。

git 位址:https://github.com/xubaodian/...

demo中,核心程式碼在common/proxy. js裡,我還實作了兩個測試服務。

在server檔案下的app.js和app2.js是兩個服務的入口檔案。

app2.js是目標伺服器,有三個測試頁面

1、http://localhost:20000/json.html post請求測試,對應'/json'接口,可發送數據,f12查看請求是否成功

2、http://localhost:20000/upload.html 文件上傳測試,對應接口'/upload'接口,上傳文件,f12查看請求是否成功,同時在伺服器upload資料夾下會有檔案。

3、http://localhost:20000/get.html  get請求測試,對應介面'/get',同樣f12查看

app2為目標伺服器,有3個介面。

1、'/upload'接口,測試文件上傳功能,上傳文件將放在uploads資料夾下,上傳的文件,文件名是一個uuid,沒有後綴,添加後綴即可查看文件是完整。測試過,傳1G的文件沒問題,再大的文件沒試過,有需要的可以試試

#2、'/json',測試POST請求。

3、'/get',測試GET請求。

app.js為代理服務為器,監聽埠為18000,將所有請求轉送至app2,即所有app2的介面靜態資源,app中存取時一致的。

測試步驟:
1、可開啟目標伺服器,透過三個頁面測試功能。

2、開啟代理伺服器,造訪以下三個頁面:

http://localhost:18000/json.html

http://localhost:18000/upload .html

http://localhost:18000/get.html

測試相同的功能。若和步驟1實現同樣功能,則代理服務功能已經實現了。

經過測試,代理功能是沒問題的。

如果問題歡迎留言,或寄信至472784995@qq.com。

至於效能,我沒測過,因為我自己這邊的應用場景,訪問量都不大,可以使用。

#

以上是node和express搭建代理伺服器的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版