上一篇文章写了使用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. winform 删除,清空指定文件夹上的所有文件或文件夹

    //递归删除文件夹及子文件C#代码: public void DeleteFolder(string dir) { if (Directory.Exists(dir)) //如果存在这个文件夹删除之 ...

  2. 利用Vue v-model实现一个自定义的表单组件

    原文请点此链接  http://blog.csdn.net/yangbingbinga/article/details/61915038

  3. 关闭win7/Server 2008非正常关机启动自动修复功能

    命令提示符下输入 bcdedit /set {default} bootstatuspolicy ignoreallfailures bcdedit /set {current} recoveryen ...

  4. cacti安装spine 解决WARNING: Result from CMD not valid. Partial Result: U错误

    安装spine用来替换cacti原本的执行方式,需要的包在附件中,请注意spine的安装包和你安装的cacti版本不用相同,最好是最新的spine 1.安装gcc #yum install -y gc ...

  5. java 基础 --int 和Integer的区别

    感到脸红:int是整形 -128~127 Integer是正整型,你怎么会想到这样的回答,妈的,有脑子吗?!!! 1,int是基本数据类型,初始为0,Integer为封装类,初始为null ①无论如何 ...

  6. 含html转义字符编码(&#22235;)转换--python

    在抓取下来的网页源码显示的是如下的内容,而不是可读性的汉字 (当然,如果是在Web页面上展示,则实体会自动被浏览器转为原字符,正常显示) 经查资料后得知, 在网页中以四开头的是HTML实体,具体什么是 ...

  7. 转:Simple Introduction to Dirichlet Process

    来源:http://hi.baidu.com/vyfrcemnsnbgxyd/item/2f10ecc3fc35597dced4f88b Dirichlet Process(DP)是一个很重要的统计模 ...

  8. 【以前的空间】poj 2288 Islands and Bridges

    一个不错的题解 : http://blog.csdn.net/accry/article/details/6607703 这是一道状态压缩.每个点有一个值,我们最后要求一个最值sum.sum由三部分组 ...

  9. hihoCoder#1698 : 假期计划 组合数

    题面:hihoCoder#1698 : 假期计划  组合数 题解: 题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段. 这样的话由于乘了阶乘,所以所有排列我们都已 ...

  10. BZOJ1293:[SCOI2009]生日礼物——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1293 https://www.luogu.org/problemnew/show/P2564#sub ...