Перенаправить все запросы, если условие выполнено с помощью промежуточного программного обеспечения - PullRequest
0 голосов
/ 04 июня 2018
  • У меня есть экземпляр запущенного сервера expressjs, который обслуживает SPA.
  • Мой API живет на другом сервере, поэтому мне нужно отклонять запросы API.
  • Я хочу создатьпромежуточное программное обеспечение, которое перенаправляет все эти запросы на другой хост, если оно удовлетворяет определенному условию.
  • Обрабатываемые запросы - это те, которые имеют target: API в заголовках запросов

пока так выглядит мое промежуточное программное обеспечение, и я могу захватить выбранный запрос, который удовлетворяет условию:

function apiHelmet(req, res, next) {
    if (req.get('target') === 'API') {
        /*
            find a way to redirect requests of all methods and pipe result to response
        */
        return res.send(response_from_external_api)
    }
    return next()
}

мои настройки:

app.use(apiHelmet)
app.get('*', renderSPA)

пример пост-запроса:

axios({
    method: 'POST',
    data: { id: 123, first_name: 'john', last_name: 'doe' },
    url: '/users',
    headers: {
        target: 'API'
    }

} ).then(result=>console.log(result))   

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы можете легко сделать это, используя следующий код.

function apiHelmet(req, res, next) {
    if (req.get('target') === 'API') {
        return res.send('caught ya')
        req.post({url: 'http://end-point', headers: req.headers, body: req.body});
        processRequest(req);
        res.setHeader('Content-Type', 'application/json');
        res.send('Req OK');
    }
    return next()
}

Подробнее см. .

0 голосов
/ 04 июня 2018

Попробуйте, вызовите другой внешний API с помощью модуля запроса и передайте ответ внешнего API напрямую на ответ вашего сервера.

var request = require('request');

app.use(apiHelmet)
app.get('*', function (req, res, next) {
    req.pipe(request('SOME URL').on('error', function (err) {
        return res.status(400).send(err)
    })).pipe(res);
});
...