express-rate-limit - перехват сообщения - PullRequest
0 голосов
/ 21 октября 2019

В моем приложении я хотел бы иметь возможность перехватить сообщение, которое создается пакетом express-rate-limit. Это пример кода, который у меня есть. Я хотел бы иметь возможность перехватить часть сообщения с помощью промежуточного программного обеспечения, чтобы я мог постобработать его (в этом случае у меня несколько языков).

const apiCreatingAccountLimiter = rateLimit({
  windowMs: 10 * 60 * 1000, // 10 minutes
  max: 10, // limit each IP to 10 requests per windowMs
  message: {
    limiter: true,
    type: "error",
    message: 'maximum_accounts'
  }
});

, а затем

router.post('/signup', apiCreatingAccountLimiter, (req, res, next) => {
// handling the post request
})

У меня есть аналогичная настройка промежуточного программного обеспечения для некоторых других моих сообщений API:

// error processing middleware
app.use((err, req, res, next) => {
    const statusCode = err.statusCode || 500;
    res.status(statusCode).send({
        type: 'error', 
        message: err.message, 
        fields: err.fields === '' ? '' : err.fields,
        code: err.code === '' ? '' : err.code,
        section: err.section === '' ? 'general' : err.section
    });
});

Однако при попытке прочитать сообщение из пакета express-rate-limit оно, похоже, не проходит через это промежуточное ПОвообще. Я полагаю, это происходит потому, что это происходит еще до того, как он может достичь какого-либо API и вызвать это промежуточное ПО.

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

rateLimit:
{ limit: 10,
current: 10,
remaining: 0,
resetTime: 2019-10-21T12:35:46.919Z 
},

Но, похоже, это не транспортировка объекта сообщения, установленного в самом верху в apiCreatingAccountLimiter. Интересно, как мне к этому добраться?

Кто-нибудь знает, как это можно сделать? Я не хочу, чтобы эти сообщения были переведены на внешний интерфейс. Мне нужно, чтобы перевод происходил на сервере NodeJS. Меня интересует только часть промежуточного программного обеспечения, где я могу перехватить сообщение и обработать его.

1 Ответ

0 голосов
/ 21 октября 2019

При чтении исходного кода вместо использования другого промежуточного программного обеспечения вы должны поработать с опциями обработчика в качестве опции.

const apiCreatingAccountLimiter = rateLimit({
  windowMs: 10 * 60 * 1000, // 10 minutes
  max: 10, // limit each IP to 10 requests per windowMs
  message: "my initial message",
      handler: function(req, res /*, next*/) {
        var myCustomMessage = require('anotherModuleYouWannaUse_ForExemple');
        res.status(options.statusCode).send(myCustomMessage);
      },
});

На этом этапе вы найдетеизвлечение исходного кода

function RateLimit(options) {
  options = Object.assign(
    {
      windowMs: 60 * 1000, // milliseconds - how long to keep records of requests in memory
      max: 5, // max number of recent connections during `window` milliseconds before sending a 429 response
      message: "Too many requests, please try again later.",
      statusCode: 429, // 429 status = Too Many Requests (RFC 6585)
      headers: true, //Send custom rate limit header with limit and remaining
      skipFailedRequests: false, // Do not count failed requests (status >= 400)
      skipSuccessfulRequests: false, // Do not count successful requests (status < 400)
      // allows to create custom keys (by default user IP is used)
      keyGenerator: function(req /*, res*/) {
        return req.ip;
      },
      skip: function(/*req, res*/) {
        return false;
      },
      handler: function(req, res /*, next*/) {
        res.status(options.statusCode).send(options.message);
      },
      onLimitReached: function(/*req, res, optionsUsed*/) {}
    },
    options
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...