我正在尝试代理一些资产路由,其中路径的动态部分来自配置文件。我使用库进行了这项工作request
,但我无法完全使用http-proxy-middleware
.
这是我使用该request
库时有效的代码:
const assets = express.Router();
app.use(`/${p.name}/assets`, assets);
assets.get('*', async (req, res) => {
return request(`${p.address}/${p.version}/assets${req.path}`).pipe(res);
});
我已经尝试了一些不同的变体http-proxy-middleware
,但这些都不起作用。示例 1:
app.use(
`/${p.name}/assets`,
httpProxy({
target: `${p.address}`,
changeOrigin: true,
pathRewrite: {
[`^${p.name}`]: `${p.version}`,
},
})
);
示例 2:
app.use(
`/${p.name}/assets`,
httpProxy({
target: `${p.address}`,
changeOrigin: true,
pathRewrite: function(path) {
return path.replace(p.name, p.version);
}
})
);
我还尝试将/${p.name}/assets/**
其用作 的第一个参数app.use
,并且我还尝试将 a 添加/assets
到对象中键和值的末尾pathRewrite
。结果总是一样的:我得到浏览器请求的资产的 302。
我什至尝试在httpProxy
记录到控制台的调用之前添加一个中间件函数,这样我就知道我的请求到达了正确的路径:
app.use(
`/${p.name}/assets`,
(req, _res, next) => {
console.log("I'm an asset proxy, short and stout: ", req.url);
next();
},
httpProxy({
target: `${p.address}`,
changeOrigin: true,
pathRewrite: {
[`^${p.name}`]: `${p.version}`,
},
})
);
但我从来没有看到过那个输出。可能是一个简单的错误。也许我的第一个论点app.use
是不正确的?帮助表示赞赏!
更新
我还尝试了旧方式和新方式的结合。我在 上安装了一个新路由器/${p.name}/assets
,发现该onProxyRequest
选项后,我在那里添加了一个函数来记录一些输出。
const assets = express.Router();
app.use(`/${p.name}/assets`, assets);
assets.use(
'*',
httpProxy({
target: p.address,
changeOrigin: true,
pathRewrite: {
[`^${p.name}`]: p.version,
},
onProxyReq: (proxyReq, req, res) => {
console.log("Hello I'm being proxied now! ", proxyReq, req, res);
},
})
);
仍然得到一个 302,我从来没有看到onProxyReq
函数的输出。