如何使用 http-proxy-middleware 代理到许多不同的目标?
How to proxy to many different targets using http-proxy-middleware?
在 http-proxy-middleware
库中,文档指出您可以使用 target
选项来指定您希望将请求代理到哪里。但是,它们还允许您使用 router
选项指定将用于在 运行 时从功能上解析目标的函数。
文档:https://www.npmjs.com/package/http-proxy-middleware
我正在使用 TypeScript,如果我查看代理的声明文件,我会看到:
你可以在这里看到 router
和 target
都可以为空。我的假设是,如果你使用一个,另一个可以省略,但你总是至少需要 1.
但是,如果我这样使用 router
属性:
app.use("/pipe", proxy({
changeOrigin: true,
router: (req: IIncomingMessageWithCookies) => {
return "https://www.google.com";
}
}));
并省略 target
,然后在 运行 时出现此错误:
> 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)
我意识到我可以将几乎任何东西放入 target
并且它会 运行 就好了,我的 router
函数是实际定义目标代理的东西。这只是库的错误还是我误解了这两个选项的用途?
包括 target
和 router
属性。 router
属性 用于 re-target option.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.whosebug.com'
}
}));
app.listen(3000);
target
属性在Config
类型中是可选的,因为我们use the shorthand like this:
时允许为空
app.use('/api', proxy('http://www.github.com',
{
changeOrigin: true,
router: function (req: IncomingMessage) {
return 'http://www.whosebug.com'
}
}
));
在 http-proxy-middleware
库中,文档指出您可以使用 target
选项来指定您希望将请求代理到哪里。但是,它们还允许您使用 router
选项指定将用于在 运行 时从功能上解析目标的函数。
文档:https://www.npmjs.com/package/http-proxy-middleware
我正在使用 TypeScript,如果我查看代理的声明文件,我会看到:
你可以在这里看到 router
和 target
都可以为空。我的假设是,如果你使用一个,另一个可以省略,但你总是至少需要 1.
但是,如果我这样使用 router
属性:
app.use("/pipe", proxy({
changeOrigin: true,
router: (req: IIncomingMessageWithCookies) => {
return "https://www.google.com";
}
}));
并省略 target
,然后在 运行 时出现此错误:
> 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)
我意识到我可以将几乎任何东西放入 target
并且它会 运行 就好了,我的 router
函数是实际定义目标代理的东西。这只是库的错误还是我误解了这两个选项的用途?
包括 target
和 router
属性。 router
属性 用于 re-target option.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.whosebug.com'
}
}));
app.listen(3000);
target
属性在Config
类型中是可选的,因为我们use the shorthand like this:
app.use('/api', proxy('http://www.github.com',
{
changeOrigin: true,
router: function (req: IncomingMessage) {
return 'http://www.whosebug.com'
}
}
));