5

我正在尝试代理一些资产路由,其中​​路径的动态部分来自配置文件。我使用库进行了这项工作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函数的输出。

4

2 回答 2

1

文档有自定义路由器选项。

-

const proxyTable = {
  'integration.localhost:3000': 'http://localhost:8001', // host only
  'staging.localhost:3000': 'http://localhost:8002', // host only
  'localhost:3000/api': 'http://localhost:8003', // host + path
  '/rest': 'http://localhost:8004', // path only
};

const options = {
  target: 'http://localhost:8000',
  router: proxyTable,
};

const myProxy = createProxyMiddleware(options);
  • 或者
function customRouter(req) {
  // I dont know what "p" stands for 
  // check the req object to see which property you want to modify
  console.log(req)
  const { hostname } = req
  const hostName = hostname.split('.')[0]
  return `https://${hostName}.sub.domain.com`
}

然后添加此选项:

  router: customRouter
于 2022-01-22T01:06:08.777 回答
0

你能检查你安装的版本吗 - 看起来你正在使用 http-proxy-middleware 包的 v0.xx 接口。最新版本是 2.XX,它公开了以下功能

const { createProxyMiddleware } = require('http-proxy-middleware');

app.use(
  `/${p.name}/assets`,
  createProxyMiddleware({
    target: `${p.address}`,
    changeOrigin: true,
    pathRewrite: {
      [`^${p.name}`]: `${p.version}`,
    },
  })
);
于 2022-01-21T17:29:13.097 回答