Как прокси к различным целям, используя http-proxy-middleware? - PullRequest
1 голос
/ 13 июня 2019

В библиотеке http-proxy-middleware документация гласит, что вы можете использовать опцию target, чтобы указать, где вы хотите прокси-запрос. Однако они также позволяют вам использовать опцию router, чтобы указать функцию, которая будет использоваться для функционального разрешения цели во время выполнения.

Документы: https://www.npmjs.com/package/http-proxy-middleware

Я использую TypeScript, и если я смотрю на файл декларации для прокси, я вижу это:

proxy

Здесь вы можете видеть, что и 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 - это то, что фактически определяет целевой прокси. Это просто ошибка в библиотеке или я неправильно понимаю, для чего используются эти 2 опции?

1 Ответ

1 голос
/ 13 июня 2019

Включите как target, так и свойство router.Свойство 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, поскольку оно разрешенобыть пустым, когда мы используем сокращение, как это :

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