node起本地服务器以及实现代理,前端接口转发
上一篇文章写了使用docker来做nginx镜像实现本地的页面代理以及接口转发,但是需要下载docker,这个对于很多人来说还是显得比较麻烦,于是这个文章就是介绍如何只用node就可以代理本地的页面和接口转发。
最简单的方法就是
1.到https://github.com/jiangzhenfei/server 下载,包括 proxy-conf.js 文件和 server.js 文件,复制到你需要代理的页面的目录,一般是index.html目录,
2.配置 proxy-conf.js 文件:如下仅供参考
//代理配置
let conifg = {
'/kdcos/':{ //将/kdcos/开头的请求代理到http://172.24.4.220:80这台服务器(类似于vue的代理配置)
target: 'http://172.24.4.220:80',
},
'/osm/':{ //将/osm/开头的请求代理到http://120.79.90.199:80这台服务器
target: 'http://120.79.90.199:80',
}
}
module.exports = conifg //导出配置文件
3.在当前目录命令行输入node server.js即可。
下面就是具体如何实现的,有兴趣的可以看看。并不影响使用
1.首先我们介绍如何启动服务器并且显示本地的页面
1.1如何起服务器(文件为index.js)
let http = require('http')
let app = http.createServer ( function(request,response){
let url = request.url
if(request.url!=='/favicon.ico'){//清除第二次访问
response.end('hello world!')
}
} )
app.listen(8000)
这个时候我们在当前的目录命令行输入 node index.js,这个时候打开浏览器输入localhost:8000,就可以在页面看大hello world!.
1.2 基于上面的思路,我们可以通过文件读取的方式将本地的index.html文件读取然后传入respones.end()
let http = require('http')
let app = http.createServer ( function(request,response){
let url = request.url
if(request.url!=='/favicon.ico'){//清除第二次访问//正常的读取文件和其他资源加载
fs.readFile( __dirname + ( url==='/' ? '/index.html':url ), function( err, data ){
if( err ){
console.log( 'file-err',err )
}else{
response.end( data )
}
});
}
} )
当输入localhost:8000或者localhost:8000/index.html也面就会出现当前所在目录的index.html页面,因为我们读取了该页面相应给该端口。
2.如何实现接口的转发
以上我们实现启动本地服务器展现页面,但是页面中的ajax接口如何实现转发呢,比如我的url为/osm/client/sort的路由需要转发到http://120.79.90.199:80这台服务器上,我们该如何实现呢
2.1使用http.request实现接口的转发
var http = require('http')
var opt = {
host:'这里放代理服务器的ip或者域名',
port:'这里放代理服务器的端口号',
method:'POST',//这里是发送的方法
path:' https://www.google.com', //这里是访问的路径
headers:{
//这里放期望发送出去的请求头
}
}
//以下是接受数据的代码
var body = '';
var req = http.request(opt, function(res) {
console.log("Got response: " + res.statusCode);
res.on('data',function(d){
body += d;
}).on('end', function(){
console.log(res.headers)
console.log(body)
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
})
req.end();
2.2监听页面中的http请求,查看是否存在需要转发的接口,利用上述方法转发得到结果后返回前台(server.js)
let http = require('http')
let fs = require('fs')
//哪些url请求需要代理(代理配置)
let conifg = {
'/kdcos/':{// /kdcos/开头的url需要代理到http://172.24.4.220:80这台服务器
target: 'http://172.24.4.220:80',
},
'/osm/':{
target: 'http://120.79.90.199:80',
}
}
let app = http.createServer ( function(request,response){
let url = request.url
if(request.url!=='/favicon.ico'){//清除第二次访问
//请求的数据是否存在代理
for ( var key in conifg){
if( url.indexOf(key) >-1 ){
let info = conifg[key].target.split(':')
let opt = {
protocol: info[0]+':',
host: info[1].slice(2),
port: info[2] || 80,
method: request.method,//这里是发送的方法
path: url, //这里是访问的路径
json: true,
headers: request.headers
}
proxy( opt, response,request )//代理方法
return;
}
}
//正常的读取文件和其他资源加载
fs.readFile( __dirname + ( url==='/' ? '/index.html':url ), function( err, data ){
if( err ){
console.log( 'file-err',err )
}else{
console.log(data)
response.end( data )
}
});
}
} )
//代理转发的方法
function proxy( opt,res ,req){
var proxyRequest = http.request(opt, function(proxyResponse) { //代理请求获取的数据再返回给本地res
proxyResponse.on('data', function(chunk) {
console.log( chunk.toString('utf-8') )
res.write(chunk, 'binary');
});
//当代理请求不再收到新的数据,告知本地res数据写入完毕。
proxyResponse.on('end', function() {
res.end();
});
res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
});
//data只有当请求体数据进来时才会触发
//尽管没有请求体数据进来,data还是要写,否则不会触发end事件
req.on('data', function(chunk) {
console.log('in request length:', chunk.length);
proxyRequest.write(chunk, 'binary');
});
req.on('end', function() {
//向proxy发送求情,这里end方法必须被调用才能发起代理请求
//所有的客户端请求都需要通过end来发起
proxyRequest.end();
});
}
app.listen(8000)
console.log('server is listen on 8000....')
现在我们在当前目录命令行输入 node server.js,浏览器打开localhost:8000就可以看到页面。
2.3现在看看我们的index.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./node_modules/jquery/dist/jquery.min.js"></script>
</head>
<body>
<h1>hahah</h1>
<button class="button"> hahh </button>
<button class="button2"> hahh </button>
<script src="./a.js"></script>
<script>
$('.button').click( function(){
$.ajax({
url:'/kdcos/app/service?page=1&pageSize=5&name=',
headers:{
"x-auth-token": "6491f900-a968-41b4-b56b-778eca4eb8b1",
},
success:function(e){
}
})
} )
$('.button2').click( function(){
$.ajax({
url:'/osm/client/sort',
success:function(e){
}
})
} )
</script>
</body>
</html>
我们点击页面中的按钮1和按钮2,就可以看到不同的返回,来自两台不同的服务器。
node起本地服务器以及实现代理,前端接口转发的更多相关文章
- 【Node】node.js实现服务器的反向代理,解决跨域问题
跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...
- 使用node建立本地服务器访问静态文件
最终目录结构 demo │ node_modules └───public │ │ index.html │ │ index.css │ └───index.js └───server.js 一.使用 ...
- 在nginx里面部署node.js本地服务器
我一个前端,为啥要搞服务器呢?因为公司就招了一个后端啊,后端忙不过来,就叫我这个萌新前端去搞后端的东西,我太难了. 直接进入正题吧,因为公司需求,要我在nginx服务器上面搭一个node.js服务器, ...
- node搭建本地服务器
随着前端不断发展,node基本已经成为必备,在调试的时候经常需要服务器,在之前的做法通常是去下载一个phpstudy 或者 xampp等启动一个服务,作为一个前端人虽然可以借助各种工具,但是怎么能不懂 ...
- node 搭建本地服务器
/** * 代理服务器 natapp -authtoken f1bdaa0535788971 * 热部署指令 supervisor index */ const Koa = require('koa' ...
- 在nginx服务器里面搭建好node.js本地服务器后,利用Node.js的FS模块,实现简单数据的写入和读取
先在server.js里面引入: var fs = require('fs'); 然后写入 // 往writeme.txt文件 写入一些内容 fs.writeFile('./writem ...
- node启动本地服务器
//下载依赖 cnpm i http cnpm i path cnpm i fsvar http = require('http'); var path = require('path'); var ...
- 利用node搭建本地服务器调试代码
在命令符中输入 npm install -g live-server安装live-server 安装完成后在项目文件夹下打开cmd,输入live-server启动
- 前端使用node.js的http-server开启一个本地服务器
前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...
随机推荐
- 数字证书认证这点事, SSL/TLS,OpenSSL
1.概念 数字证书 HTTPS请求时,Server发给浏览器的认证数据,用私钥签名,并且告诉浏览器公钥,利用公钥解密签名,确认Server身份. 证书还会指明相应的CA,CA能确认证书是否真的是CA颁 ...
- ASP.NET MVC 多语言解决方案
1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...
- PHP中Session和Cookie的探究
一.Session (1)Session的由来以及介绍 Session:在计算机中,尤其是在网络应用中,称为“会话控制”,生存时间为用户在浏览某个网站时,从进入网站到关闭这个网站所经过的这段时间,也就 ...
- linux svn apache
借助apache运行的svn服务器 一:安装Apache HTTP Server 1.安装Apache HTTP Server yum install httpd httpd-devel -y 2.修 ...
- Luogu1092 NOIP2004虫食算(搜索+高斯消元)
暴力枚举每一位是否进位,然后就可以高斯消元解出方程了.然而复杂度是O(2nn3),相当不靠谱. 考虑优化.注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数 ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [ZJOI2010]贪吃的老鼠 网络流
---题面--- 题解: 这是一道强题emmmm,做法非常巧妙,,,我也是看了好久大佬题解才看明白一点 首先考虑没有限制的情况,即n个老鼠可以在同一时刻吃同一块奶酪 对各个时间段拆点,连奶酪 ---& ...
- mmc驱动的读写过程解析
mmc io的读写从mmc_queue_thread()的获取queue里面的request开始. 先列出调用栈,看下大概的调用顺序, 下面的内容主要阐述这些函数如何工作. host->ops- ...
- 洛谷 P1505 [国家集训队]旅游 解题报告
P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...
- HDOJ(HDU).1864 最大报销额 (贪心)
HDOJ(HDU).1864 最大报销额 题意分析 题目有点问题,原题中说的 单项物品的价值不得超过600元 应该是单类物品的价值不能超过600元. 一开始以为是01背包,后来按贪心写过了. 一张一张 ...