NodeJs 第二十章 代理

在计算机网络中,代理是一种中间服务,能够代理用户与网络资源之间的通信。代理服务器可以缓存网页内容、过滤网络流量或隐藏用户的真实IP地址等功能。

在日常开发中,我们接触最多的是客户端发送ajax到服务端。但是服务端并不是 node ,而是java或者go
例如我们用 vue 开发应用。我们的感知是从客户端直接发送 ajax 到服务端。但是在浏览器发送ajax 到服务端,服务端响应到浏览器会出现跨域。这个时候就需要配置代理,node 此时就可以充当这个角色。
实际在开发环境 vue 就是利用 express 创建了一个开发服务,充当代理角色。这个代理服务主要是利用 http-proxy-middleware 中间件,实现代理服务器。

在这里插入图片描述

node 实现代理服务器原理

  1. 浏览器发送 ajax 请求到 node 服务
  2. node 服务将和 java 或者 go 服务约定好的 api转发给java 或者 go服务端
  3. java 服务或者 node 服务响应个 node 代理服务
  4. node 服务在响应给浏览器

简单示例

const http = require('http');

const proxyServer = http.createServer((request, response) => {
  // 创建代理请求的选项
  const options = {
    hostname: '目标服务器的主机名',
    port: 80, // 目标服务器的端口号
    path: request.url,
    method: request.method,
    headers: request.headers
  };

  // 发起代理请求
  const proxyRequest = http.request(options, (proxyResponse) => {
    // 将代理服务器收到的响应转发给客户端
    response.writeHead(proxyResponse.statusCode, proxyResponse.headers);
    //  将代理服务器的响应通过管道传输给客户端,实现响应的转发。
    proxyResponse.pipe(response);
  });

  // 将客户端发来的请求体转发给目标服务器
  request.pipe(proxyRequest);

  // 处理代理请求错误
  proxyRequest.on('error', (error) => {
    console.error('代理请求错误:', error);
    response.statusCode = 500;
    response.end();
  });
});

// 启动代理服务器
const PORT = 3000;
proxyServer.listen(PORT, () => {
  console.log('代理服务器已启动,监听端口', PORT);
});
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/339346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建DNS 服务

安装DNS 服务 [rootlocalhost ~]# yum install bind -y Complete! [rootlocalhost ~]# DNS 配置文件 [rootlocalhost ~]# vim /etc/named.conf [rootlocalhost ~]# cat -n /etc/named.conf 1 // ... 12 options { 13 #listen-on port 53 { 127.0.0.1; }; 14 list…

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路:方程: 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…

说说你对归并排序的理解?如何实现?应用场景?

一、是什么 归并排序(Merge Sort)是建立归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用 将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使…

几个简单好用Python库,让你工作效率翻倍

更多资料获取 📚 个人网站:ipengtao.com Python是一门强大的编程语言,不仅可以进行软件开发,还可以通过各种优秀的第三方库来提高工作效率。本文将介绍几个简单而好用的Python库,它们可以帮助你在各种领域提高工作效率…

02不吉利日期,noi练习题,小学生编程

02:不吉利日期 总时间限制: 1000ms 内存限制: 65536kB 描述 在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号…

设计模式—行为型模式之观察者模式

设计模式—行为型模式之观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe&#…

Qt应用开发(安卓篇)——Hello Qt On Android

一、前言 这一篇从实际出发,讲述如何创建、编译和部署Qt On Android项目。 二、ADB调试 ADB的全称为Android Debug Bridge,就是起到调试桥的作用,主要用于连接计算机与Android 设备,以便进行调试和数据传输。ADB 可以实现以下主要…

如何使用CRM实现销售流程自动化?CRM如何提高销售效率?

科技在当今时代扮演着重要的角色。在商业领域,我们用很多不同的软件来完成业务、提高效率。销售被认为是一个企业的灵魂。没有销售,企业很难生存。为了使销售更加有效,自动化是每个企业都应该采用的一个重要战略。实现销售过程自动化最简单的…

【视频媒体】深入了解直播视频流

深入了解直播视频流🎥 YouTube、TikTok live和Twitch上的直播视频是如何工作的? 直播视频流与常规流媒体不同,因为视频内容通过互联网近乎实时发送,通常只有几秒钟的延迟。 下图解释了实现这一目标背后所发生的事情。 步骤1&…

【QT+QGIS跨平台编译】之四:【libSSH2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libSSH2介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、libSSH2介绍 libSSH2是一个开源的C函数库,用来实现SSH2协议。 SSH(Secure SHell)到目前为止有两个不兼容的版本——SSH1和SSH2。 SSH2避免了RSA的专利问题,并修补了CRC…

HR人才测评,招聘技术部经理的胜任力素质模型与任职资格

招聘技术部经理是企业招聘中的关键职位之一。为了确保招聘到胜任的人才,需要制定一个详细的胜任力素质模型和任职资格要求。下面将详细说明。 企业版团测 - 在线人才测评系统、人才测评工具、人才盘点、团队测评、心理测评、职业测评 - 在线工具网团测,…

Python爬虫--5

1、异步爬虫 异步爬虫的方式: (1)多线程,多进程(不建议使用) 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。 弊端:无法无限制的开启多线程…

3.php开发-个人博客项目输入输出类留言板访问IPUA头来源

目录 知识点 : 输入输出 配置环境时: 搜索框: 留言板: 留言板的显示(html): php代码显示提交的留言: 写入数据库 对留言内容进行显示: php全局变量-$_SERVER 检测来源 墨…

1.11马原总复习PART2

社会一定发展阶段 ,生产力,生产关系总和 一定经济基础之上的意识形态,制度、组织和设施 普遍联系的根本内容和变化发展的内在动力 唯物辩证法的实质和核心 贯穿其他规律的中心线索 提供了根本方法矛盾分析法 价值由社会必要劳动时间决定…

安装ddddocr中遇到的问题

1、需要先安装: pip3 install pyinstaller --no-use-pep517 pip install scikit-build pip install setuptools pip install pyinstaller pip install pillow 重要是的是保证一个python 环境,多个python环境会导致各种问题。并且保证python>3.8…

LTC2944库仑计(电量计)芯片应用笔记(Arduino,ESP32)

一、一些基础知识 1.蓄电池的容量单位 (1)毫安时mAH 蓄电池的容量一般会采用毫安时(mAH)为单位,比如2000mAH的蓄电池意思是该蓄电池理论上可以以2000mA的电流持续放电1小时,2000mA*1H2000mAH。当然这个是…

C++从小白到初级工程师【个人学习笔记】

目录 1.背景2.基础二维数组概念二维数组定义方式 二维数组数组名称概念例子 函数的分文件编写概念示例 指针指针的基本概念指针变量的定义和使用 空指针和野指针空指针实例野指针实例 const修饰指针概念const修饰指针 --- 常量指针 指针和数组作用示例 指针和函数作用示例 指针…

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

雍禾医疗获“年度医疗大健康消费企业”奖项 雍禾植发品牌深入人心

不久前&#xff0c;在钛媒体2023 T-EDGE全球创新大会上&#xff0c;钛媒体重磅发布了2023 EDGE AWARDS全球创新评选榜单。希望一起透过这些推动行业变革的公司、个人和产品&#xff0c;全面展现2023的产业格局。 “植发第一股”雍禾医疗荣获“年度医疗大健康消费企业”奖项。雍…

Unity 编辑器篇|(十二)自定义编辑器窗体(EditorWindow,ScriptableWizard) (全面总结 | 建议收藏)

目录 1. 前言2. 创建自定义窗体&#xff1a;EditorWindow2.1 参数总览2.2 EditorWindow的生命周期2.3 区别&#xff1a;CreateWindow()&#xff0c;GetWindow() &#xff0c;GetWindowWithRect()2.4 代码示例 3. 创建对话框窗体&#xff1a;ScriptableWizard3.1 参数总览3.2 区…