$ 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();

https://www.cnblogs.com/resultwp/p/9945606.htm vue 非常规跨域实现 proxyTable 设置及依赖

、config/index.js  设置跨域的地址
proxyTable: {
'/api': { //跨域标识 请求地址为‘http://1xxx.xxx.com/index/list’, 请求时 “/api/index/list”
target: 'http://1xxx.xxx.com',
changeOrigin: true, //允许跨域
pathRewrite: { //重新跨域标识
'^/api': ''
}
}
}, 、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();/*让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: ,
title: 'NodeBlog',
});
}); const server = http.createServer(app).listen(,'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:
}
app.SERVER_INFO = {
name: 'zhangsan',
age:
}
});

需要使用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().json({
state: ,
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(' ')[];
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模块

http-proxy-middleware及express实现反向代理的更多相关文章

  1. Forward Proxy & Reverse Proxy | 正向代理 和 反向代理

    对请求和响应内容不做修改的转发的服务器,被称为代理服务器.代理服务器分为两种类型:正向代理 和 反向代理. 正向代理:面向互联网,从更广范围获取信息的代理. 反向代理:面向内部,一般用于某企业的网站的 ...

  2. 反向代理(Reverse Proxy)

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...

  3. golang http proxy反向代理

    本文介绍golang中如何进行反向代理. 下面例子中, proxy server接收client 的 http request,转发给true server,并把 true server的返回结果再发 ...

  4. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

  5. Nginx应用-Location路由反向代理及重写策略 请求转发-URL匹配规则 NGINX Reverse Proxy

    NGINX Docs | NGINX Reverse Proxy https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/ ...

  6. 用express框架实现反向代理

    目前很多公司开发都是前后台分离开发,于是我用node起了一个服务,用node中的express框架实现了反向代理.(通俗易懂的讲就是我在我的电脑访问不到后台同事的电脑接口,这样做以后就可以在我本地访问 ...

  7. 反向代理Reverse proxy

    https://www.zhihu.com/question/24723688/answer/160252724 反向代理在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的 ...

  8. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy

    https://zh.wikipedia.org/wiki/反向代理 反向代理在计算机网络中是代理服务器的一种.服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后 ...

  9. Docker Nginx-Proxy 容器Nginx Proxy反向代理

    Docker Nginx-Proxy 容器Nginx Proxy反向代理   简单介绍 Docker容器的自动Nginx反向代理   dockerhub地址 https://hub.docker.co ...

随机推荐

  1. Linux系统Zip压缩和解压缩

    Linux系统可以使用Zip来压缩占用空间较大的文件以便进行文件传输,传输完成后再进行解压缩来获取原文件.Linux安装Zip的命令为 apt-get install zip 安装完成后,使用 zip ...

  2. sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a length on dialect mysql

    映射数据库时报错:sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a lengt ...

  3. 数组中的reduce

    reduce方法第一次对我的感觉是很鸡肋,但是深入了解,才发现其中的奥妙,是个非常强大且实用的方法 var arr = [1,2,3,4,5,6,7]; var sum = arr.reduce( ( ...

  4. 检查shell脚本

    1.检查solr服务监控脚本: #/bin/bash starttime=$(date +%Y-%m-%d\ %H:%M:%S) http_code=$(curl -I -m -o /dev//sol ...

  5. ES6 正则扩展

    一.新增 flags 属性 ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符. // ES5 的 source 属性 // 返回正则表达式的正文 /abc/ig.source // ...

  6. Codeforces Round #511 (Div. 2) C. Enlarge GCD (质因数)

    题目 题意: 给你n个数a[1]...a[n],可以得到这n个数的最大公约数, 现在要求你在n个数中 尽量少删除数,使得被删之后的数组a的最大公约数比原来的大. 如果要删的数小于n,就输出要删的数的个 ...

  7. python中函数的定义、返回值以及参数的简要介绍

    一. 1.函数 定义:def关键字开头,空格之后接函数名称和圆括号(),后面紧跟‘:”. 函数是对功能的封装 语法: def 函数名(形参列表): 函数体(代码块,return) 调用: 函数名(实参 ...

  8. jquery仿排列顺序,变换颜色更换class

    ps:箭头是字体图标,需要的可以去阿里字体下载,也可自己替换图片 点击之后的 代码部分 <ul class="Ep_sxxz"> <span class=&quo ...

  9. 45、[源码]-Spring容器创建-执行BeanFactoryPostProcessor

    45.[源码]-Spring容器创建-执行BeanFactoryPostProcessor 5.invokeBeanFactoryPostProcessors(beanFactory);执行BeanF ...

  10. [React + GraphQL] Use useLazyQuery to manually execute a query with Apollo React Hooks

    When using useQuery from Apollo React Hooks, the request will be sent automatically after the compon ...