搭建nodejs代理服务器解决跨域问题

初始化项目

1
npm init -y

创建目录 view 和文件 app.js,view目录下存放项目文件,app.js用来启动本地服务和配置本地代理

安装依赖

安装相关依赖,只需要两个依赖包,express是Web开发框架,http-proxy-middleware就是代理库

1
npm install express http-proxy-middleware connect-history-api-fallback connect-timeout path yarn -S

配置代理

编写app.js,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 导入express,路径包,子进程中的异步进程,代理,设置项目根目录
const express = require('express')
const path = require('path')
const {exec} = require("child_process")
const proxyMiddleWare = require("http-proxy-middleware")
const root = path.join(__dirname, './view')

// 生成express实例,配置代理,启动服务
const app = express();
// 配置代理设置项HOST为目标服务器(即API服务器),PORT为启动服务端口
const { HOST = 'http://192.168.16.28:8080/', PORT = '8899' } = {}
const proxyOption ={target:HOST, changeOrigoin:true}
app.set('port', PORT);
// 设置根目录为静态资源
app.use('/', express.static(root))
// 使用反向代理
app.use("/api", proxyMiddleWare(proxyOption))
// 启动服务
app.listen(app.get('port'), () => {
let url = `http://localhost:${app.get('port')}`
// 自动打开默认浏览器
switch (process.platform) {
case "darwin":
exec(`open ${url}`);
case "win32":
exec(`start ${url}`);
default:
exec(`open ${url}`);
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
var express = require("express");
var path = require("path");
const timeout = require("connect-timeout");
const proxy = require("http-proxy-middleware");
var app = express();

// 这里从环境变量读取配置,方便命令行启动
// HOST 指目标地址(即API服务器)
// PORT 服务端口
const { HOST = "http://127.0.0.1:8080", PORT = "2020" } = process.env;

// 反向代理(这里把需要进行反代的路径配置到这里即可)
// eg:将/api/test 代理到 ${HOST}/api/test
// proxy 中间件的选择项

var apiProxy = proxy("/api", {
target: HOST,
pathRewrite: { "^/api": "" },
secure: false,
changeOrigin: true
});

app.use(apiProxy);

// 超时时间
const TIME_OUT = 30 * 1e3;
// 设置超时 返回超时响应
app.use(timeout(TIME_OUT));
app.use((req, res, next) => {
if (!req.timedout) next();
});

app.use(require("connect-history-api-fallback")());

// appblog为项目目录
app.use(express.static(path.resolve(__dirname, "appblog")));

app.get("*", function(req, res) {
if (req.originalUrl.indexOf("favicon.ico")) {
res.sendFile(path.resolve(__dirname, "dist", "favicon.ico"));
}
});

// 设置端口
app.set("port", PORT);

app.listen(app.get("port"), function() {
console.log(`server running @${app.get("port")}`);
});

启动代理

在根文件夹内打开控制台启动项目node ./app.js

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :