使用nodeJs的express+axios+cors做代理
前端在請求后端時通常會遇到跨域cors
問題,如果只在本地開發可以通過webpack或vite的proxy設置。但如果需要在線上或者其他地方繞過跨域,可以使用代理的方法。
1. 創建文件夾
并創建以下文件
package.json
{"name": "proxy","version": "1.0.0","description": "","main": "proxy.js","scripts": {"start": "node index.js","start:pm2": "pm2 start index.js --name your-app-name"},"author": "","license": "ISC","dependencies": {"axios": "^1.8.4","cors": "^2.8.5","express": "^3.5.3"}
}
index.js
const express = require("express");
const axios = require("axios");
const cors = require("cors");// 創建 Express 應用
const app = express();// 使用中間件解析 JSON 和 URL 編碼的請求體
app.use(express.json());
app.use(express.urlencoded({ extended: true }));// 使用 CORS 中間件,允許跨域請求,并設置 credentials 為 true
app.use(cors({origin: function (origin, callback) {// 允許所有來源的請求callback(null, true);},credentials: true, // 允許攜帶憑證})
);// 目標地址
const TARGET_URL = "https://www.baidu.com/apis";// 代理路由
app.use("/apis", async (req, res) => {try {// 獲取客戶端請求的路徑和查詢參數const path = req.path;const queryParams = req.query;// 構造目標 URLconst targetUrl = `${TARGET_URL}${path}`;// 轉發請求到目標地址const response = await axios({method: req.method,url: targetUrl,params: queryParams,headers: {...req.headers,host: new URL(TARGET_URL).host, // 替換 Host 頭為目標地址的主機名},data: req.body, // 如果是 POST/PUT 請求,轉發請求體});// 將目標服務器的響應返回給客戶端res.status(response.status).send(response.data);} catch (error) {// 處理錯誤if (error.response) {// 如果目標服務器返回了錯誤響應res.status(error.response.status).send(error.response.data);} else {// 其他錯誤res.status(500).send({ error: "Proxy request failed" });}}
});// 啟動服務器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Proxy server is running on port ${PORT}`);
});
2. 執行npm i
3. 執行
提供node或PM2兩種執行方式
- npm run start
- npm run start:pm2
之后所有訪問 http://localhost:3000/apis
的請求將被代理到https://www.baidu.com/apis
;具體可以自行配置
4. 部署線上 node 方式
-
打開寶塔->軟件商店->安裝node.
-
創建一個文件夾,并將下面三個文件放上去
-
點擊終端,執行
npm i
-
創建一個node項目,配置啟動命令和端口
啟動成功后訪問寶塔IP:3000/apis
將會被代理到https://www.baidu.com/apis
4. 部署線上 pm2 方式
- 打開寶塔->軟件商店->PM2管理器
- 同上
- 同上
- 配置pm2
啟動成功后訪問寶塔IP:3000/apis
將會被代理到https://www.baidu.com/apis