Как использовать createProxyMiddleware с вложенной логикой - PullRequest
1 голос
/ 04 апреля 2020

/ node_modules / http-proxy / lib / http-proxy / index. js: 120; Ошибка: сокет зависает

Предыдущая запись: / node_modules / http-proxy / lib / http-proxy / index. js: 120; Ошибка: сокет зависает

Я пытаюсь использовать createProxyMiddleware({ target: serviceProvider}) вместо apiProxy.web(req, res, {target: serviceProvider});. Браузер зависает и ничего не показывает (хотя я вижу вращение на вкладке)

Как правильно использовать createProxyMiddleware с вложенной кодовой базой, как показано ниже?

Вот исходный код.

app.get('/source*',
    function(req, res, next) {
        req.query.RelayState = req.url;
        if(req.user) { // if user is authenticated,
            if(req.originalUrl) {
                resource_path = req.originalUrl.split('/source')[1];
                console.log(req.user['email'] + ' is viewing ' + req.originalUrl);
            }
            createProxyMiddleware({ target: serviceProvider})
            // apiProxy.web(req, res, {target: serviceProvider});
        } else {
            if(process.env.MODE=='HACK') {
              createProxyMiddleware({ target: serviceProvider})
              // apiProxy.web(req, res, {target: serviceProvider});
            } else {
              passport.authenticate('samlStrategy')(req, res, next);
            }
        }
    },
);

Между тем это работает: app.get('/source*', createProxyMiddleware({ target: serviceProvider}))

1 Ответ

1 голос
/ 04 апреля 2020

Проблема в том, что промежуточное ПО прокси создано, но фактически не вызывается, и в результате запрос зависает. Один из способов решить эту проблему - создать промежуточное программное обеспечение, как вы это делали (но желательно вне обработчика маршрута, как это было бы создано при каждом запросе), а затем вызвать его с текущими express аргументами промежуточного программного обеспечения:

const serviceProviderProxy = createProxyMiddleware({target: serviceProvider }); 

    app.get('/source*', (req, res, next) => {
        req.query.RelayState = req.url;
        if (req.user) { // if user is authenticated,
            if (req.originalUrl) {
                resource_path = req.originalUrl.split('/source')[1];
                console.log(req.user['email'] + ' is viewing ' + req.originalUrl);
            }
            return serviceProviderProxy.call(serviceProviderProxy, req, res, next); // you need to return here if there's more code below the else block, otherwise return is not needed
        } else {
            if(process.env.MODE=='HACK') {
               return serviceProviderProxy.call(serviceProviderProxy, req, res, next);              
            } else {
               passport.authenticate('samlStrategy')(req, res, next);
            }
        }
        // potential more code ... 
    });
...