代理简单版

9 阅读1分钟
const express = require('express');
const http = require('http');
const https = require('https');
const url = require('url');

const app = express();
// DHOP端口
const PORT = 7015;

// CORS 头部配置
function setCorsHeaders(req, res) {
  // 1. 设置核心 CORS 头(必须与前端 Origin 匹配,不能用 *)
  const allowedOrigin = req.headers.origin || '*'; // 生产环境建议固定前端域名
  res.header('Access-Control-Allow-Origin', allowedOrigin);
  // 2. Allow-Methods:必须包含实际请求的方法(这里取前端请求的 Access-Control-Request-Method)
  const allowedMethods = req.headers['access-control-request-method'] || '*';
  res.header('Access-Control-Allow-Methods', allowedMethods);
  // 3. Allow-Headers:必须包含前端请求的所有自定义头(取 Access-Control-Request-Headers)
  const allowedHeaders = req.headers['access-control-request-headers'] || '*';
  res.header('Access-Control-Allow-Headers', allowedHeaders);
  // 4. 可选:允许携带 Cookie(如果前端用 withCredentials: true)
  res.header('Access-Control-Allow-Credentials', 'true');
  // 允许浏览器缓存预检结果(秒)
  res.header('Access-Control-Max-Age', '86400');
}

// 代理中间件函数
function createProxy(targetUrl) {
  return (req, res) => {
    const target = url.parse(targetUrl);
    let path = req.url;
    if (req.url.includes('register.json')) {
      path = `/IntelliBusinessAPP/${req.url}`;
    }
    // 如果是 OPTIONS 预检请求,直接在代理层处理(不转发到后端)
    if (req.method === 'OPTIONS') {
      setCorsHeaders(req, res);
      // 强制设置 204 状态码 + 空内容
      res.statusCode = 204;
      res.setHeader('Content-Length', '0');
      res.end(); // 直接返回响应,不转发到后端
      return; // 终止后续代理逻辑
    }
    const options = {
      hostname: target.hostname,
      port: target.port || (target.protocol === 'https:' ? 443 : 80),
      path,
      method: req.method,
      headers: req.headers
    };

    const proxyReq = (target.protocol === 'https:' ? https : http).request(options, (proxyRes) => {
      // 添加 CORS 响应头
      const headers = { ...proxyRes.headers };
      setCorsHeaders(req, res);
      // 设置响应头
      let statusCode = proxyRes.statusCode;
      res.writeHead(statusCode, headers);
      proxyRes.pipe(res);
    });

    // 处理错误
    proxyReq.on('error', (err) => {
      console.error('Proxy error:', err);
      setCorsHeaders(req, res);
      res.status(500).send('Proxy error');
    });

    // 将请求体转发到目标服务器
    req.pipe(proxyReq);
  };
}


app.use('/', createProxy('http://localhost:8080'));


// 启动服务器
app.listen(PORT, () => {
  console.log(`Proxy server is running on http://localhost:${PORT}`);
});

module.exports = app;