Node.js 如何使用http代理中间件代理多个不同的目标?

Node.js 如何使用http代理中间件代理多个不同的目标?,node.js,typescript,proxy,http-proxy,http-proxy-middleware,Node.js,Typescript,Proxy,Http Proxy,Http Proxy Middleware,在http代理中间件库中,文档说明可以使用target选项指定代理请求的位置。但是,它们还允许您使用路由器选项指定一个函数,该函数将用于在运行时从功能上解析目标 文件: 我正在使用TypeScript,如果我查看代理的声明文件,我可以看到: 您可以在这里看到,router和target都可以为空。我的假设是,如果你使用一个,另一个可以省略,但你总是需要至少1 但是,如果我像这样使用路由器属性: app.use("/pipe", proxy({ changeOrigin: true,

http代理中间件
库中,文档说明可以使用
target
选项指定代理请求的位置。但是,它们还允许您使用
路由器
选项指定一个函数,该函数将用于在运行时从功能上解析目标

文件:

我正在使用TypeScript,如果我查看代理的声明文件,我可以看到:

您可以在这里看到,
router
target
都可以为空。我的假设是,如果你使用一个,另一个可以省略,但你总是需要至少1

但是,如果我像这样使用
路由器
属性:

app.use("/pipe", proxy({
    changeOrigin: true,
    router: (req: IIncomingMessageWithCookies) => {
        return "https://www.google.com";
    }
}));
并省略
目标
,然后在运行时我得到以下错误:

> node ./dist/app.js

C:\SkyKick\SkyKick.SEWR\src\node_modules\http-proxy-middleware\lib\config-factory.js:43
    throw new Error(ERRORS.ERR_CONFIG_FACTORY_TARGET_MISSING)
    ^

Error: [HPM] Missing "target" option. Example: {target: "http://www.example.org"}
    at Object.createConfig (C:\SkyKick\SkyKick.SEWR\src\node_modules\http-proxy-middleware\lib\config-factory.js:43:11)
    at new HttpProxyMiddleware (C:\SkyKick\SkyKick.SEWR\src\node_modules\http-proxy-middleware\lib\index.js:17:30)
    at module.exports (C:\SkyKick\SkyKick.SEWR\src\node_modules\http-proxy-middleware\index.js:4:10)
    at Object.<anonymous> (C:\SkyKick\SkyKick.SEWR\src\dist\app.js:8:18)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
>节点。/dist/app.js
C:\SkyKick\SkyKick.SEWR\src\node\u modules\http代理中间件\lib\config factory.js:43
抛出新错误(ERRORS.ERR\u CONFIG\u FACTORY\u TARGET\u缺失)
^
错误:[HPM]缺少“目标”选项。示例:{目标:http://www.example.org"}
在Object.createConfig(C:\SkyKick\SkyKick.SEWR\src\node\u modules\http代理中间件\lib\config factory.js:43:11)
在新的HttpProxyMiddleware(C:\SkyKick\SkyKick.SEWR\src\node\u modules\http代理中间件\lib\index.js:17:30)
在module.exports(C:\SkyKick\SkyKick.SEWR\src\node\u modules\http代理中间件\index.js:4:10)
反对。(C:\SkyKick\SkyKick.SEWR\src\dist\app.js:8:18)
at模块编译(内部/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:700:10)
在Module.load(内部/modules/cjs/loader.js:599:32)
在tryModuleLoad(内部/modules/cjs/loader.js:538:12)
at Function.Module._load(内部/modules/cjs/loader.js:530:3)
位于Function.Module.runMain(内部/modules/cjs/loader.js:742:12)

我意识到我可以将几乎任何东西放入
target
中,它将正常运行,而我的
router
函数实际上是定义目标代理的东西。这只是库中的一个错误,还是我误解了这两个选项的用途?

包括
目标
路由器
属性。
路由器
属性用于为特定请求重新设置
选项的目标。目标

target
属性在
Config
类型中是可选的,因为当我们:


好的,关于可空属性,这完全是有道理的,但是我仍然不理解强迫开发人员像这样重新确定目标,而不仅仅是用许多不同的方法定义单个属性意味着什么。在我的场景中,我希望采用一些任意格式的域和URL模式,并将这些源映射到许多不同的目标。在这种情况下,我没有任何一个目标可以使用,是吗?我查看了源代码,确实看到
路由器
基本上只是覆盖了原始的
选项。target
属性就像我想象的那样,但是在这种情况下需要添加一个
目标
仍然感觉很奇怪。我觉得验证逻辑应该检查是否至少存在一个,而不管实现如何。关于您想要进行的映射,您是否看过将
路由器
值设置为对象而不是函数?我可以理解当
目标
为空且
路由器
有值时抛出错误的意思。乍一看,原来的开发人员似乎很懒惰。不过,我很理解,在进一步的调查中,可能会发现一些更深层次的原因。如果没有更深层次的原因,可以将
target
设置为类似
http://required-target.why
是一种合理且廉价的解决方法。我认为我不能将其设置为对象,因为这意味着将发生有限的映射集,事实上,我需要映射完全是常规的,并且可以扩展到任意数量,所有映射都基于传入请求URI的模式。话虽如此,简单地将一些“垃圾”放入
target
属性似乎就可以了。我只是想确认我了解它是如何工作的。这似乎是一个牵强的问题,图书馆本身看到它是如何被广泛采用。谢谢
import express = require('express');
import proxy = require('http-proxy-middleware');

const app = express();

app.use('/api', proxy({
    target: 'http://www.github.com',
    changeOrigin: true,
    router: function (req: IncomingMessage) {
        return 'http://www.stackoverflow.com'
    }
}));

app.listen(3000);
app.use('/api', proxy('http://www.github.com',
    {
        changeOrigin: true,
        router: function (req: IncomingMessage) {
            return 'http://www.stackoverflow.com'
        }
    }
));