当前位置: 首页 > news >正文

nodejs实现http与https服务;同时处理proxy代理的解决方案

// nodejs服务提供的http协议示例
const http = require('http');
const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });res.end(Date.now() + ' == > http访问成功8080')
});
server.listen(8080, () => {console.log('服务已开启');
})
// nodejs服务提供的https协议示例
const https = require('https');
const fs = require('fs');
const path = require('path');
const options = {key: fs.readFileSync(path.join(__dirname, './key.pem')),cert: fs.readFileSync(path.join(__dirname, './cert.pem')),
};
const server = https.createServer(options, (req, res) => {res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });res.end('https访问8081成功 == > ' + Date.now())
});
server.listen(8081, () => {console.log('服务已开启');
})
// 正向代理 :如axios,http.proxy 用户直到,类似于梯子
var http = require('http');
var httpProxy = require('http-proxy')// 创建代理服务器
let proxy = httpProxy.createProxyServer()let server = http.createServer((req, res) => {proxy.web(req, res, {target: 'http://localhost:8080',// target: 'https://localhost:8081', // 并不能代理https})
})server.listen(3000)
// server启动成功
server.on('listening', () => {console.log('http启动完成')
})// 关闭HTTP服务器server.on('close', () => {console.log('服务器关闭')
})
// 反向代理 :解决用户请求的,用户不知道
let httpProxy = require('http-proxy')
let https = require('https');
const fs = require('fs');
const path = require('path');const options = {key: fs.readFileSync(path.join(__dirname, './key.pem')),cert: fs.readFileSync(path.join(__dirname, './cert.pem')),
};// 这是我们配置的域名,我们可以访问这些域名,拿到对应的结果
let hosts = {'as.cc': 'http://localhost:8080',// 'as.com': 'https://localhost:8081',// 也不支持https
}// 创建代理服务器
let proxy = httpProxy.createProxyServer()let server = https.createServer(options, (req, res) => {// 拿到host 访问对应的服务器let host = req.headers['host'].split(':')[0]console.log(666.789, host, hosts[host])proxy.web(req, res, {target: hosts[host] || 'https://localhost:8081'})
})server.listen(3001)
// server启动成功
server.on('listening', () => {console.log('https启动完成')
})// 关闭HTTPS服务器
server.on('close', () => {console.log('服务器关闭')
})
// # nodejs原生实现转发http请求,方案一
const http = require("http");
const server = http.createServer();server.on("request", (req, res) => {var { connection, host, ...originHeaders } = req.headers;var options = {"method": req.method,"hostname": "localhost","port": "8080","path": req.url,"headers": { originHeaders }}//接收客户端发送的数据var p = new Promise((resolve, reject) => {let postbody = [];req.on("data", chunk => {postbody.push(chunk);})req.on('end', () => {let postbodyBuffer = Buffer.concat(postbody);resolve(postbodyBuffer)})});//将数据转发,并接收目标服务器返回的数据,然后转发给客户端p.then((postbodyBuffer) => {let responsebody = []var request = http.request(options, (response) => {response.on('data', (chunk) => {responsebody.push(chunk)})response.on("end", () => {responsebodyBuffer = Buffer.concat(responsebody)res.setHeader('Content-Type', 'text/html;charset=utf-8');res.end(responsebodyBuffer);})})// 使用request的write方法传递请求体request.write(postbodyBuffer)// 使用end方法将请求发出去request.end();})
});
server.listen(3002, () => {console.log("runnng3002");
})
// # nodejs原生实现转发http请求,方案二
const http = require('http');
const server = http.createServer((req, res) => {res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });const options = {hostname: 'localhost',port: 8080,path: req.url,method: req.method};const proxyReq = http.request(options, (proxyRes) => {proxyRes.on('data', (chunk) => {res.write(chunk);});proxyRes.on('end', () => {res.end();});});proxyReq.on('error', (e) => {console.error(`请求遇到问题: ${e.message}`);});req.on('data', (chunk) => {proxyReq.write(chunk);});req.on('end', () => {proxyReq.setHeader('Content-Type', 'text/html;charset=utf-8');proxyReq.end();});
});server.listen(3003, () => {console.log('服务器正在监听3003端口');
});
// # nodejs原生实现转发https请求,方案一
const fs = require('fs');
const path = require('path');
let http = require('http');
let https = require('https');const proxyoptions = {key: fs.readFileSync(path.join(__dirname, './key.pem')),cert: fs.readFileSync(path.join(__dirname, './cert.pem')),
};const server = https.createServer(proxyoptions);server.on("request", (req, res) => {var { connection, host, ...originHeaders } = req.headers;var options = {"method": req.method,// 随表找了一个网站做测试,被代理网站修改这里"hostname": "localhost","port": "8080","path": req.url,"headers": { originHeaders }}//接收客户端发送的数据var p = new Promise((resolve, reject) => {let postbody = [];req.on("data", chunk => {postbody.push(chunk);})req.on('end', () => {let postbodyBuffer = Buffer.concat(postbody);resolve(postbodyBuffer)})});//将数据转发,并接收目标服务器返回的数据,然后转发给客户端p.then((postbodyBuffer) => {let responsebody = []var request = http.request(options, (response) => {response.on('data', (chunk) => {responsebody.push(chunk)})response.on("end", () => {responsebodyBuffer = Buffer.concat(responsebody)res.setHeader('Content-Type', 'text/html;charset=utf-8');res.end(responsebodyBuffer);})})// 使用request的write方法传递请求体request.write(postbodyBuffer)// 使用end方法将请求发出去request.end();})
});
server.listen(3004, () => {console.log("runnng3004");
})
// # nodejs原生实现转发https请求,方案一
const fs = require('fs');
const path = require('path');
let http = require('http');
let https = require('https');const proxyoptions = {key: fs.readFileSync(path.join(__dirname, './key.pem')),cert: fs.readFileSync(path.join(__dirname, './cert.pem')),
};const server = https.createServer(proxyoptions, (req, res) => {res.writeHead(200, { 'Content-Type': 'text/html;charset=utf8' });const options = {hostname: 'localhost',port: 8080,path: req.url,method: req.method};const proxyReq = http.request(options, (proxyRes) => {proxyRes.on('data', (chunk) => {res.write(chunk);});proxyRes.on('end', () => {res.end();});});proxyReq.on('error', (e) => {console.error(`请求遇到问题: ${e.message}`);});req.on('data', (chunk) => {proxyReq.write(chunk);});req.on('end', () => {proxyReq.setHeader('Content-Type', 'text/html;charset=utf-8');proxyReq.end();});
});server.listen(3004, () => {console.log('服务器正在监听3004端口');
});
http://www.lryc.cn/news/128023.html

相关文章:

  • C# WPF ListBox 动态显示图片
  • 游戏如何防御DDOS流量攻击呢,用游戏盾真的有用么?
  • vue项目引入antDesignUI组件
  • 非结构化数据库-MinIO基本集成
  • Etcd备份及恢复
  • 使用JavaMail发送邮件时嵌入公司logo图片
  • 注解 @Async
  • Python“牵手”lazada商品评论数据采集方法,lazadaAPI申请指南
  • 微信小程序通用字体代码
  • LVS负载均衡DR模式
  • ArcGIS Pro基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例全流程科研能力提升
  • ​ Spring Clould 配置中心 - Nacos
  • 1609.奇偶数
  • c++--异常
  • ArcGIS 利用cartogram插件制作变形地图
  • Mybatis批量插入方式有哪些
  • 前端框架学习-React(一)
  • Android Studio实现解析HTML获取图片URL将图片保存到本地
  • 单例模式的理论与实践
  • 深入了解MongoDB:灵活的文档型数据库与应用案例
  • 【HarmonyOS北向开发】-01 HarmonyOS概述
  • Node.js入门
  • 指针、数组、sizeof、strlen相关知识与练习题目
  • 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测
  • MyBatis动态SQL:打造灵活可变的数据库操作
  • nginx代理请求到内网不同服务器
  • 【C# 基础精讲】文件读取和写入
  • 设计模式——经典单例
  • 【HarmonyOS】鸿蒙应用获取华为帐号手机号码步骤(API7及以下)
  • webpack相关面试