核心原理
浏览器的同源策略只约束浏览器 ,不约束服务器 。
你的前端页面(http://localhost:8080)请求你自己的 Node 代理(同源),代理再把请求转发给目标后端(跨域)。代理拿到数据后返回给前端,从而完美绕过浏览器的跨域拦截。
第一步:初始化项目
在你的项目根目录(即 index.html 所在文件夹)下,打开终端(CMD 或 VS Code 终端),执行:
bash
npm init -y
第二步:安装依赖
只需要两个轻量级库:
bash
npm install express http-proxy-middleware
- express :开启静态服务器,让你在
http://协议下访问页面(解决file://协议无法发请求的问题)。 - http-proxy-middleware:核心代理中间件。
第三步:创建代理文件 proxy-server.js
在项目根目录 下新建一个 proxy-server.js 文件,复制粘贴以下完整代码(已集成路径修正,复制即用):
javascript
// 1. 引入依赖
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const path = require('path');
const app = express();
// 2. 静态资源托管(关键!指向本文件所在的根目录)
// 使用 __dirname 确保无论你在哪里执行 node 命令,都能正确找到 index.html
app.use(express.static(path.join(__dirname, './')));
// 3. 代理配置(核心)
app.use('/api', createProxyMiddleware({
target: 'https://你要请求的目标域名.com', // 【必改】替换为你的真实后端地址,例如 http://localhost:8081
changeOrigin: true, // 必须为 true,修改请求头中的 host 为目标域名
secure: false, // 如果目标接口是 https 且证书无效,设为 false 可忽略报错
// pathRewrite: { '^/api': '' }, // 如果后端接口路径没有 /api 前缀,取消注释这行去掉前缀
}));
// 4. 启动服务
app.listen(8080, () => {
console.log('✅ 代理服务器启动成功!');
console.log('👉 请访问: http://localhost:8080/你的HTML文件名.html');
});
⚠️ 必改项
- 将
target的'https://你要请求的目标域名.com'替换为你的真实接口地址(例如http://localhost:3000或https://api.xxx.com)。 - 如果你的后端接口路径不包含
/api(例如直接是https://xxx.com/user/list),请取消pathRewrite那行的注释,这样前端请求/api/user/list会被转发为/user/list。
第四步:修改前端代码
在你的 index.html 或 script.js 中,将所有的请求地址去掉域名部分 ,统一改为以 /api 开头。
修改前(会跨域):
javascript
fetch('https://你要请求的目标域名.com/user/info')
修改后(走代理):
javascript
fetch('/api/user/info') // 相对路径,自动请求 http://localhost:8080/api/...
第五步:启动并访问
-
在终端中运行:
bashnode proxy-server.js -
重要 :不要 双击 HTML 文件打开。请打开浏览器,地址栏输入:
http://localhost:8080此时页面中的所有
/api请求都会被自动代理转发到目标服务器。
常见问题排雷(FAQ)
| 问题现象 | 解决办法 |
|---|---|
访问 localhost:8080 显示 Cannot GET / |
检查 proxy-server.js 中的 express.static 路径是否指向了正确的 HTML 文件夹。确保 index.html 和 proxy-server.js 在同一级目录。 |
| 请求返回 404 | 检查后端接口路径是否真的以 /api 开头。如果不是,开启 pathRewrite 配置。 |
| 请求返回 CORS 错误 | 检查是否没有通过 localhost:8080 访问,或者依然双击了 HTML 文件。必须通过代理服务器的地址访问。 |
| 端口 8080 被占用 | 将代码最后一行的 8080 改为其他端口(如 3000),访问时对应修改即可。 |
| POST 请求被拦截(预检 OPTIONS) | http-proxy-middleware 默认支持转发 OPTIONS 请求,保持 changeOrigin: true 即可,无需额外配置。 |
总结流程图
text
浏览器(http://localhost:8080)
↓ 请求 /api/xxx (同源,无跨域)
Node 代理服务器 (http://localhost:8080)
↓ 转发请求 (服务器之间无跨域限制)
目标后端服务器 (https://api.xxx.com)
↓ 返回数据
Node 代理服务器
↓ 返回数据
浏览器(成功拿到数据)
这份指南已经帮你避开了 file:// 协议和路径不对的坑,按步骤操作即可彻底解决本地开发跨域问题。祝编码顺利!🚀