使用nodeJs的express+axios+cors做代理

使用nodeJs的express+axios+cors做代理

前端在请求后端时通常会遇到跨域cors问题,如果只在本地开发可以通过webpack或vite的proxy设置。但如果需要在线上或者其他地方绕过跨域,可以使用代理的方法。

1. 创建文件夹

并创建以下文件
package.json

js 复制代码
{
  "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

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;

    // 构造目标 URL
    const 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 方式

  1. 打开宝塔->软件商店->安装node.

  2. 创建一个文件夹,并将下面三个文件放上去

  3. 点击终端,执行npm i

  4. 创建一个node项目,配置启动命令和端口

    启动成功后访问宝塔IP:3000/apis将会被代理到https://www.baidu.com/apis

4. 部署线上 pm2 方式

  1. 打开宝塔->软件商店->PM2管理器
  2. 同上
  3. 同上
  4. 配置pm2

    启动成功后访问宝塔IP:3000/apis将会被代理到https://www.baidu.com/apis
相关推荐
Littlewith6 天前
Node.js:Web模块、Express框架
java·开发语言·前端·c++·后端·node.js·express
Fireworkitte7 天前
node.js 为什么要装 express组件
node.js·express
古怪今人12 天前
NodeJS Express 静态文件、中间件、路由案例
中间件·express
congvee15 天前
express学习第2期 - dotenv 加载配置文件
express
年纪轻轻就扛不住17 天前
Express 入门指南(超详细教程)
前端·前端框架·node.js·express·js
搞前端的小菜17 天前
从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
gpt·react.js·express
叫我菜菜就好17 天前
【node后端】搭建项目(Express+Ts+Typeorm+Mysql一步到位)
mysql·oracle·express
前端小盆友18 天前
从零实现一个GPT 【React + Express】--- 【5】实现网页生成能力
gpt·react.js·express
搞前端的小菜18 天前
从零实现一个GPT 【React + Express】--- 【2】实现对话流和停止生成
gpt·react.js·express
前端小盆友20 天前
从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
react.js·chatgpt·express