Перейти к содержанию

Прокси

Node.js сервер, как и любой другой веб-сервер, может выступать в качестве прокси для всех или только части запросов. Для проксирования запросов через сервер Node.js, работающий в связке с фреймворком Express, используется npm модуль express-http-proxy.

npm install express-http-proxy --save

В самом простом использовании модуля express-http-proxy прокси выглядит следующим образом.

let proxy = require('express-http-proxy')

app.use('/api', proxy('http://example.com'))

Здесь все запросы к маршрутам, начинающимся с /api будут перенаправлены на http://example.com.

Вторым параметром функции промежуточной обработки express-http-proxy можно передать объект конфигурации со следующими свойствами:

filter - определяет, какие запросы должны быть проксированы, и принимает функцию, возвращающую булевое значение (если true - запрос проксируется);

app.use(
  '/api',
  proxy('http://example.com', {
    filter: (req, res) => req.headers.hasOwnProperty('Authorization')
  })
)

userResDecorator - используется для модификации объекта ответа перед его отдачей клиенту;

app.use(
  '/api',
  proxy('http://example.com', {
    userResDecorator: (proxyRes, proxyResData) => {
      let _data = JSON.parse(proxyResData)
      _data.proxy = true
      return JSON.stringify(_data)
    }
  })
)

userResHeaderDecorator - используется для модификации заголовков ответа;

app.use(
  '/api',
  proxy('http://example.com', {
    userResHeaderDecorator: hdrs => {
      hdrs.Proxy = true
      return hdrs
    }
  })
)

proxyReqPathResolver - используется для модификации пути запроса (путем считается все, что следует после хоста);

app.use(
  '/api',
  proxy('http://example.com', {
    proxyReqPathResolver: req => {
      console.log(req.url)
      return req.url
    }
  })
)

proxyReqOptDecorator - предназначен для модификации параметров объекта запроса (заголовков, HTTP метода, параметров адресной строки и т. д.);

app.use(
  '/api',
  proxy('http://example.com', {
    proxyReqOptDecorator: reqOpts => {
      reqOpts.method = 'POST'
      return reqOpts
    }
  })
)

proxyReqBodyDecorator - используется для модификации тела запроса;

app.use(
  '/api',
  proxy('http://example.com', {
    proxyReqBodyDecorator: body => {
      console.log(body)
      return body
    }
  })
)

proxyErrorHandler - предназначен для задания пользовательского поведения при возникновении ошибки (по умолчанию транслирует ошибку клиенту);

app.use(
  '/api',
  proxy('http://example.com', {
    proxyErrorHandler: (err, res, next) => {
      next(err)
    }
  })
)

parseReqBody - булевое значение, если true - парсит тело запроса, если false - у объекта запроса не будет свойства body, рекомендуется отключать из соображений эффективности при передаче бинарных данных (по умолчанию true);

limit - устанавливает ограничение на размеры тела запроса (по умолчанию 1Мб), если размеры будут превышены - ответ вернется с 413 статусом;

app.use(
  '/api',
  proxy('http://example.com', {
    limit: '10mb'
  })
)

memozieHost - булевое значение, если true - то первый параметр (адрес, куда проксируются запросы), будет разбираться при каждом запросе, если false - то только при первом и полученное значение будет использоваться в дальнейшем для всех поступающих запросов (по умолчанию true);

https - булевое значение, если true - запрос будет принудительно проксирован с использованием протокола https (по умолчанию протокол прокси совпадает с протоколом, указанным в заголовке Host);

preserveHostHdr - булевое значение, если true - сохраняет в качестве HTTP заголовка Host значение клиента;

timeout - устанавливает в миллисекундах время ожидания от сервера, на который перенаправляется запрос, по истечении заданного времени ответ вернется с 504 статусом.

app.use(
  '/api',
  proxy('http://example.com', {
    timeout: 2000
  })
)