如何使用http-proxy-middleware代理许多不同的目标?

时间:2019-06-13 00:38:41

标签: node.js typescript proxy http-proxy http-proxy-middleware

.fl-post-grid-post { font-size: 14px; } .fl-post-feed-post { border: 0; } .fl-post-text { padding: 20px; } .fl-post-text p { font-size: 16px; } .fl-post-text .textarea p { font-size: 16px; font-weight: 600; } .fl-post-text .textarea ol li { font-size: 16px; font-weight: 600; } .fl-post-text .one-sixth { font-size: 16px; font-weight: 700; color: white; width:100%; margin-bottom: 2px; } .fl-post-text .one-sixth span { background-color: #d81452; padding: 5px; } .fl-post-text .five-sixths { border-left: solid 2px #CACACA; padding-left: 20px; } .spacer { height: 15px; } .fl-post-text .textarea {background-color:#F1EBEB; border-bottom: solid 2px #CACACA; padding: 10px; } .fl-post-text h2 {font-size: 18px; } .fl-post-title { font-size: 20px; font-weight: 700; line-height: 26px; margin: 0; padding: 10px 0 5px; } .fl-post-title span { background-color: #f4dbdf; padding: 5px; } .fl-post-meta { padding: 0 0 15px; } .point ::before{ content: ''; display: inline-block; margin-left:-28px; width: 15px; height: 15px; -moz-border-radius: 15px; -webkit-border-radius:15px; border-radius:15px; background-color: grey; } 库中,文档指出您可以使用http-proxy-middleware选项指定代理请求的位置。但是,它们还允许您使用target选项来指定一个函数,该函数将在运行时用于功能上解析目标。

文档:https://www.npmjs.com/package/http-proxy-middleware

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

proxy

您可以在此处看到routerrouter都可以为空。我的假设是,如果您使用一个,则可以省略另一个,但是您始终至少需要1。

但是,如果我这样使用target属性:

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函数实际上就是定义目标代理的东西。这只是库中的错误,还是我误解了这两个选项的用途?

1 个答案:

答案 0 :(得分:1)

同时包含targetrouter属性。 router属性用于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.stackoverflow.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.stackoverflow.com'
        }
    }
));