node+express+http-proxy-middleware做代理

Posted 青草圆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node+express+http-proxy-middleware做代理相关的知识,希望对你有一定的参考价值。

最近,不赶着做项目,于是想着怎样做公司的前后端分离,这个时候想到了nodejs,于是打算今天做一个代理的demo,其实代码很简单,但是一直卡在一个地方,现在问题解决了,贴上代码和截图。

html

<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <style type="text/css">
        .hello{
            color: #428bca;
        }
    </style>
</head>
<body>
    <h3>这是index页面</h3>

    <span class="hello">你可以点击这里</span>

    <script type="text/javascript">
        $(function(){
            var contextPath = \'http://localhost:3000\';
            $(\'.hello\').on(\'click\',function(){
                $.ajax({
                    type:\'get\',
                    data:\'click\',
                    url:contextPath+\'/api/hello\',
                    success:function(data){
                        console.log(data);
                    },
                    error:function(data){
                        console.log(data);
                    }

                })
            })
        })
    </script>

</body>
</html>

localhost:3000服务端的代码

const express = require(\'express\');
const proxy = require(\'http-proxy-middleware\');//引入代理中间件
const app = express();
app.use(express.static(\'public\'));
//app.use(express.static(\'client\'));

// Add middleware for http proxying 
const apiProxy = proxy(\'/api\', { target: \'http://localhost:8080\',changeOrigin: true });//将服务器代理到localhost:8080端口上[本地服务器为localhost:3000]
app.use(\'/api/*\', apiProxy);//api子目录下的都是用代理

// Render your site
app.get(\'/index.htm\', function(req,res){
     res.sendFile(__dirname+\'/src/index.html\');
});



app.listen(3000, () => {
  console.log(\'Listening on: http://localhost:3000\');
});

localhost:8080服务上的代码

var express = require(\'express\');
var app = express();
app.use(express.static(\'public\'));
var server = app.listen(8080,function(){
    var host = server.address().address;
    var port = server.address().port;
    console.log(\'应用实例,访问地址为 http://%s:%s\',host,port);
})

app.get(\'/api/hello\', function(req,res){
     let data = {}
     data["name"] = "lucy";
     data["age"] = "23";
     res.send(data);
});

项目结构截图

  

  

其中需要注意的一个细节是,当起了一个本地服务器,那么静态文件的引入会有一个问题,解决办法如下Nodejs Express下引入本地文件的方法 出处:http://www.cnblogs.com/cocos2014/p/4378548.html?utm_source=tuicool&utm_medium=referral

Express的结构如下:

    |---node_modules------用于安装本地模块。

    |---public------------用于存放用户可以下载到的文件,比如图片、脚本文件、样式表等。
    |---routes------------用于存放路由文件。
    |---views-------------用于存放网页的模板。
    |---app.js------------应用程序的启动脚本。
    |---package.json------项目的配置文件。
 
从上述结构中可知要把本地文件放入public中,比如脚本文件js文件就可以放入public文件夹下的javascripts中。
至于为什么放到其他位置不起作用,答案如下:
app.js中对于引入静态文件的程序如下:
app.use(express.static(path.join(__dirname, \'public\')));//__dirname为程序执行时的绝对路径。
这样一来,就指明了本地文件的引入方法。所以说把本地文件放入public下就有理有据了,下面讲述一下在Express Ejs中具体的使用方法。
例如想引入本地的bootpicker.js文件,只需在html head中加入一下代码:
<script src="/javascripts/datepicker.js" type="text/javascript"></script>
当浏览器发出非HTML文件请求时,服务器端就到public目录下寻找javascripts,再到javascripts下寻找bootpicker.js文件。

  

 

以上是关于node+express+http-proxy-middleware做代理的主要内容,如果未能解决你的问题,请参考以下文章

初识 Express 丨Node.js

基于express开发Node服务器

node.js 和 express 的区别

怎么让新建的express包用公共的node

前端node.js框架node.js框架express

Node js之Express初步介绍和安装