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文件。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM