http-proxy-middleware及express實現反向代理


$ npm install --save-dev http-proxy-middleware

 

npm install express
// 引用依賴
var express = require('express');
var proxy = require('http-proxy-middleware');

// proxy 中間件的選擇項
var options = {
        target: 'http://www.example.org', // 目標服務器 host
        changeOrigin: true,               // 默認false,是否需要改變原始主機頭為目標URL
        ws: true,                         // 是否代理websockets
        pathRewrite: {
            '^/api/old-path' : '/api/new-path',     // 重寫請求,比如我們源訪問的是api/old-path,那么請求會被解析為/api/new-path
            '^/api/remove/path' : '/path'           // 同上
        },
        router: {
            // 如果請求主機 == 'dev.localhost:3000',
            // 重寫目標服務器 'http://www.example.org' 為 'http://localhost:8000'
            'dev.localhost:3000' : 'http://localhost:8000'
        }
    };

// 創建代理
var exampleProxy = proxy(options);

// 使用代理
var app = express();
    app.use('/api', exampleProxy);
    app.listen(3000);

 

https://www.cnblogs.com/resultwp/p/9945606.htm vue 非常規跨域實現 proxyTable 設置及依賴 

1、config/index.js  設置跨域的地址
     proxyTable: {
        '/api': {    //跨域標識     請求地址為‘http://1xxx.xxx.com/index/list’, 請求時 “/api/index/list”
             target: 'http://1xxx.xxx.com',
             changeOrigin: true,   //允許跨域
             pathRewrite: {            //重新跨域標識
                  '^/api': ''
             }
         }
     },
 
2、build/webpack.dev.conf.js  引入express、http-proxy-middleware,如下:
    const proxyMiddleware = require('http-proxy-middleware')
 
    var express = require('express')
    var app = express()
    // proxy api requests
    const proxyTable=config.dev.proxyTable;
     Object.keys(proxyTable).forEach(function (context) {
      var options = proxyTable[context]
       if (typeof options === 'string') {
         options = { target: options }
       }
       app.use(proxyMiddleware(options.filter || context, options))
    })

 

 

a、引入express
 const express = require('express') const app = express() 
b、引入反向代理插件 http-proxy-middlewar
 const proxyMiddlewar = require('http-proxy-middlewar')
 

代理配置

ok,這兩個就是進行反向代理的准備工作。下面開始進行反向代理配置。 首先,需要知道的是后端服務器的ip和端口號,
 const proxyPath = 'http://168.96.0.1:8080' // 注意,這里只需要IP和端口號就可以了。這個ip我瞎寫的 
然后,將這個path配置到代理配置項中
 const proxyOption = {target: proxyPath,changeOrigin: true} 

現在用express使用這個代理就好了

app.use('/api', proxyMiddlewar(proxyOption)) // 下面詳細說明這一段 app.listen() //表示監聽的端口號也就是本地的端口號。用vue-cli構建的項目不需要寫這行代碼


express指定返回的攔截器處理:

const express = require("express");
const http = require("http");
const app = express();
////////////////////// 添加Log4js配置 /////////////////////////////
log.use(app);

////////////////////// 獲取post過來的數據 /////////////////////////////
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));

////////////////////// 設置web工程的根目錄 /////////////////////////////
app.use(express.static(__dirname + '/'));

////////////////////// 允許跨域 /////////////////////////////
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    if(req.method=="OPTIONS") res.send(200);/*讓options請求快速返回*/
    else  next();
});

////////////////////// 利用文件來拆分路由的規模 /////////////////////////////
var apiRouterIndex =  require('./routes/api/apiRouterIndex');
app.use('/api', apiRouterIndex);

////////////////////// 404處理 /////////////////////////////
app.get('*', function (req, res){
    console.log('404 handler..')
    res.render('common_page/404.html', {
        status: 404,
        title: 'NodeBlog',
    });
});

const server = http.createServer(app).listen(3000,'localhost',function () {
    const host = server.address().address;
    const port = server.address().port;
    // console.log("應用實例,訪問地址為 http://%s:%s", host, port);
    process.env.host = host;
    // process 不能存儲JSON格式的數據
    process.env.port = port;
    global.userInfo = {
        name: 'huangbiao',
        age: 30
    }
    app.SERVER_INFO = {
        name: 'zhangsan',
        age: 30
    }
});

需要使用app.use('/api', apiRouterIndex);這種方式配置URL請求的范圍

const express = require('express');
const router = express.Router();
const tokenConfig = require('../common/config/tokenConfig');
// 處理token 的同一工具
const jwtUtils = require('../common/util/jwtUtils');
const apiService = require('./service/apiService.js');
var jwt= require('jsonwebtoken'); // 使用jwt簽名
var fs = require('fs');

// 用來驗證token,作為后台管理的攔截器
router.use(function (req, response, next) {
    var isToken = jwtUtils.checkTokenByRequest(req);
    // 如果獲取的token 不合格,則給出提示信息
    if (!isToken) {
        response.status(200).json({
            state: 0,
            message: 'token數據不正確'
        });
        return false;
    }
    next();
});
// 查詢所有的標簽 接口
router.get('/tags/list', function(req, res, next) {
    // 創建tag標簽
    apiService.queryTagList({},function (err, results, fields) {
        res.json({
            data: results
        });
    });
});

// 刪除標簽 接口
router.post('/tags/delete', function(req, res, next) {
    console.log(req.body);
    var id = req.body.id;
    // 刪除tag標簽
    apiService.deleteTagById(id, function (err, result) {
        res.json({
            status: true
        });
    });
});
module.exports = router;

在所有URL前面添加一個router.use(function (req, response, next) {next();});方法,用來驗證token是否正確,這個攔截器只是針對http://localhost:3000/api打頭的請求

// 引入模塊依賴
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 創建 token 類
class Jwt {
    constructor(data) {
        this.data = data;
    }
    // 檢查token
    static checkTokenByRequest (requestObj) {
        // 拿取token 數據 按照自己傳遞方式寫
        var tokenOrigin = requestObj.headers['Authorization'] || requestObj.headers['authorization'];
        if (tokenOrigin === '' || tokenOrigin === undefined || tokenOrigin === null ) {
            console.log('的值不能為空')
            return false;
        }
        // 獲取服務器返回的token值
        var tokenStr = tokenOrigin.split(' ')[1];
        if (tokenStr === '' || tokenStr === undefined || tokenStr === null ) {
            console.log('token 格式不正確')
            return false;
        }
        return tokenStr;
    }
    // 從header請求中獲取token 
    static getTokenFromHeader (requestObj) {
        var tokenStr = this.checkTokenByRequest(requestObj);
        if (tokenStr) {
            return tokenStr;
        } else {
            return null;
        }
    }
}

module.exports = Jwt;

 




https://www.jianshu.com/p/a248b146c55a http-proxy-middleware

https://blog.csdn.net/xmloveth/article/details/56847456 npm模塊之http-proxy-middleware使用教程(譯

https://www.jianshu.com/p/47c9e65f5a04 Vue項目中使用express實現反向代理

https://blog.csdn.net/hbiao68/article/details/85769755 express指定返回的攔截器處理

https://www.jianshu.com/p/9401a099c032?utm_source=oschina-app node.js之express模塊


免責聲明!

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



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