Модуль http-proxy-middleware Nodejs предоставляет способ перенаправления запроса с помощью функцию в параметре option.router. Как описано здесь:

router: function(req) {
    return 'http://localhost:8004';
}

Мне нужно реализовать процесс, который проверяет некоторые аспекты в запросе (заголовки, URL-адреса ... вся эта информация находится под рукой в объекте req, который получает функция) и в некоторых случаях возвращает ошибку 404. Что-то вроде этого:

router: function(req) {
    if (checkRequest(req)) {
        return 'http://localhost:8004';
    }
    else {
        // Don't proxy and return a 404 to the client
    }
}

Однако я не знаю, как решить эту // Don't proxy and return a 404 to the client. Поиск http-proxy-middleware не так очевиден (по крайней мере, я не нашел способа ...).

Любая помощь / отзывы по этому поводу приветствуются!

3
fgalan 14 Мар 2018 в 13:18

2 ответа

Лучший ответ

В конце я решил выбросить исключение и использовать обработчик ошибок Express по умолчанию (я не упоминал в сообщении с вопросом, но прокси живет в приложении на основе Express).

Что-то вроде этого:

app.use('/proxy/:service/', proxy({
        ...
        router: function(req) {
            if (checkRequest(req)) {
                // Happy path
                ...
                return target;
            }
            else {
                throw 'awfull error';
            }
        }
}));

...

// Handler for global and uncaugth errors
app.use(function (err, req, res, next) {
    if (err === 'awful error') {
        res.status(404).send();
    }
    else {
        res.status(500).send();
    }
    next(err);
});
0
fgalan 14 Мар 2018 в 21:01

Вы можете сделать это в onProxyReq вместо того, чтобы бросать и перехватывать ошибку:

app.use('/proxy/:service/', proxy({
    ...
    onProxyReq: (proxyReq, req, res) => {
        if (checkRequest(req)) {
            // Happy path
            ...
            return target;
        } else {
            res.status(404).send();
        }
    }
}));
1
mshindal 4 Дек 2018 в 20:48