You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express中为不同路径配置独立代理的实现问题

问题场景

现有Express项目已配置/ZTEST123和/ZTESTSMT两个静态资源路径,原全局设置了单一代理,现需为这两个路径分别配置对应不同SAP OData服务地址的代理,自行尝试的写法未生效,寻求可行方案。

原核心代码:

var express = require('express');
var cors = require('cors');
const proxy = require('express-http-proxy');
var process = require('process');

var app = express();

app.use(cors())

app.set('port', (process.env.PORT || 8080));

app.use("/ZTEST123", express.static(__dirname + '/ZTEST123/webapp'));
app.use("/ZTESTSMT", express.static(__dirname + '/ZTESTSMT/webapp'));

app.use(proxy('http://localhost:8000/sap/opu/odata/sap/service1/$metadata?sap-client=001&sap-language=EN'));
 
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

app.all('/', function(request, response) {});

app.listen(app.get('port'), function() {}); 

setTimeout(function() {
  process.exit();
}, 1000000);

自行尝试的写法(未生效):

app.use("/ZTEST123", proxy('http://localhost:8000/sap/opu/odata/sap/service1/$metadata?sap-client=001&sap-language=EN'));
app.use("/ZTESTSMT", proxy('http://localhost:8000/sap/opu/odata/sap/service2/$metadata?sap-client=001&sap-language=EN'));
问题原因

直接将包含$metadata及查询参数的完整URL传给express-http-proxy是错误的:

  • 该库的第一个参数应为目标服务的基础根地址,而非具体接口路径
  • 未处理路径重写,请求的前缀(如/ZTEST123)会被直接附加到目标地址后,导致请求路径错误
  • 查询参数无需硬编码在代理地址中,可通过代理自动传递
可行实现方案

调整代理配置,针对每个路径单独设置代理,通过路径重写剥离前缀,并确保静态资源优先于代理处理:

var express = require('express');
var cors = require('cors');
const proxy = require('express-http-proxy');
var process = require('process');

var app = express();

app.use(cors())

app.set('port', (process.env.PORT || 8080));

// 优先挂载静态资源中间件,确保本地静态文件优先响应
app.use("/ZTEST123", express.static(__dirname + '/ZTEST123/webapp'));
app.use("/ZTESTSMT", express.static(__dirname + '/ZTESTSMT/webapp'));

// 为/ZTEST123配置专属代理,对应service1
app.use('/ZTEST123', proxy('http://localhost:8000/sap/opu/odata/sap/service1/', {
  proxyReqPathResolver: function(req) {
    // 剥离请求路径中的/ZTEST123前缀,保留后续路径
    return req.url.replace(/^\/ZTEST123/, '');
  },
  // 统一添加SAP客户端和语言参数(若前端未携带则自动补充)
  proxyReqOptDecorator: function(proxyReqOpts, srcReq) {
    const paramStr = 'sap-client=001&sap-language=EN';
    proxyReqOpts.path += proxyReqOpts.path.includes('?') ? `&${paramStr}` : `?${paramStr}`;
    return proxyReqOpts;
  }
}));

// 为/ZTESTSMT配置专属代理,对应service2
app.use('/ZTESTSMT', proxy('http://localhost:8000/sap/opu/odata/sap/service2/', {
  proxyReqPathResolver: function(req) {
    return req.url.replace(/^\/ZTESTSMT/, '');
  },
  proxyReqOptDecorator: function(proxyReqOpts, srcReq) {
    const paramStr = 'sap-client=001&sap-language=EN';
    proxyReqOpts.path += proxyReqOpts.path.includes('?') ? `&${paramStr}` : `?${paramStr}`;
    return proxyReqOpts;
  }
}));

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

app.all('/', function(request, response) {});

app.listen(app.get('port'), function() {}); 

setTimeout(function() {
  process.exit();
}, 1000000);
关键说明
  • 静态资源优先:静态资源中间件放在代理之前,确保访问静态文件时直接返回本地资源,只有静态资源不存在的请求才会走代理
  • 路径重写:通过proxyReqPathResolver剥离请求前缀,保证代理到SAP服务的路径符合OData接口要求
  • 参数统一处理:使用proxyReqOptDecorator自动添加SAP客户端和语言参数,既避免硬编码,也支持前端自行携带参数时自动合并

内容的提问来源于stack exchange,提问作者schnippko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:42:24