上一篇文章写了使用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起本地服务器以及实现代理,前端接口转发的更多相关文章

  1. 【Node】node.js实现服务器的反向代理,解决跨域问题

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  2. 使用node建立本地服务器访问静态文件

    最终目录结构 demo │ node_modules └───public │ │ index.html │ │ index.css │ └───index.js └───server.js 一.使用 ...

  3. 在nginx里面部署node.js本地服务器

    我一个前端,为啥要搞服务器呢?因为公司就招了一个后端啊,后端忙不过来,就叫我这个萌新前端去搞后端的东西,我太难了. 直接进入正题吧,因为公司需求,要我在nginx服务器上面搭一个node.js服务器, ...

  4. node搭建本地服务器

    随着前端不断发展,node基本已经成为必备,在调试的时候经常需要服务器,在之前的做法通常是去下载一个phpstudy 或者 xampp等启动一个服务,作为一个前端人虽然可以借助各种工具,但是怎么能不懂 ...

  5. node 搭建本地服务器

    /** * 代理服务器 natapp -authtoken f1bdaa0535788971 * 热部署指令 supervisor index */ const Koa = require('koa' ...

  6. 在nginx服务器里面搭建好node.js本地服务器后,利用Node.js的FS模块,实现简单数据的写入和读取

    先在server.js里面引入: var fs = require('fs');   然后写入  // 往writeme.txt文件 写入一些内容     fs.writeFile('./writem ...

  7. node启动本地服务器

    //下载依赖 cnpm i http cnpm i path cnpm i fsvar http = require('http'); var path = require('path'); var ...

  8. 利用node搭建本地服务器调试代码

    在命令符中输入 npm install -g live-server安装live-server 安装完成后在项目文件夹下打开cmd,输入live-server启动

  9. 前端使用node.js的http-server开启一个本地服务器

    前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...

随机推荐

  1. PAT 1058 选择题

    https://pintia.cn/problem-sets/994805260223102976/problems/994805270356541440 批改多选题是比较麻烦的事情,本题就请你写个程 ...

  2. Jenkins系列-Jenkins用户权限和角色配置

    由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,这边将使用Role Strategy Plugin,介绍页面:https://wiki.jenki ...

  3. project之chrome.exe

    查看chrome.exe的以来文件可以得到下面这个列面,大部分是在%systemroot%/system32下面的系统dll文件,只有两个是chromium自己生成的:base.dll, conten ...

  4. 异步请求Python库 grequests的应用和与requests库的响应速度的比较

    requests库是python一个优秀的HTTP库,使用它可以非常简单地执行HTTP的各种操作,例如GET.POST等.不过,这个库所执行的网络请求都是同步了,即cpu发出请求指令后,IO执行发送和 ...

  5. 爬虫之手机APP抓包教程-亲测HTTP和HTTPS均可实现

    当下很多网站都有做自己的APP端产品,一个优秀的爬虫工程师,必须能够绕过难爬取点而取捷径,这是皆大欢喜的.但是在网上收罗和查阅了无数文档和资料,本人亲测无数次,均不能正常获取HTTPS数据,究其原因是 ...

  6. DELPHI BOOKMARK使用

    关于书签(BookMark)操作:       书签操作主要用于在表中快速地定位记录指针,在应用程序中常常要保存记录指针所在的位置,在进行其他处理之后,希望能快速地返回到先前指针所在的位置,此时,使用 ...

  7. Codeforces 498B Name That Tune

    不想说啥了…这是我被卡常数卡得最惨的一次… 首先根据期望的线性性,我们考虑每首歌能够被认出来的概率,也就是每首歌对答案贡献的期望.那么定义F[i]为第i首歌被认出来的概率是做不了的,自然想到F[i][ ...

  8. (转)java +libsvm 安装与测试:

    libsvm 用SVM实现简单线性分类  (转自:http://www.cnblogs.com/freedomshe/archive/2012/10/09/2717356.html) 0. 下载lib ...

  9. cf1073d Berland Fair

    ~~~题面~~~ 题解: 可以发现,每走完一圈付的钱和买的数量是有周期性的,即如果没有因为缺钱而买不起某家店的东西,那么这一圈的所以决策将会和上一圈相同,这个应该是很好理解的,想想就好了. 因为钱数固 ...

  10. FPGA学习记录_设计一个计数器

    此处设计一个数器,使 学习板上 的 LED 状态每 500ms翻转一次. 学习板上晶振为50MHz,也就是说时钟周期为 20ns , 这样可以计算得出 500ms = 500_000_000ns/20 ...