Ограничить количество запросов в минуту, используя Supertest - PullRequest
0 голосов
/ 03 сентября 2018

Мы используем супертест с Typescript для тестирования API. Для некоторых из них (например, регистрация пользователя, смена пароля и т. Д.) Отправляется адрес электронной почты, который требуется для подтверждения (токен подтверждения пользователя, токен сброса пароля и т. Д.).

Чтобы достичь этого, мы решили использовать GuerillaMail , так как это простой одноразовый почтовый клиент с API. После выполнения предварительных условий (настройки электронной почты с использованием их электронной почты) следующий фрагмент кода выполняет свою работу в нескольких случаях:

private async getEmailId(sid_token: string, emailType: EmailType): Promise<string> {
        var mail;
        var mailToken = this.getSidToken(sid_token);

        //Keep trying until the email gets in the inbox
        // Infinite loop is prevented by the jest framework timeout
        while (!mail) {
            const result = await request(this.guerillaMailApiUrl)
                .get('')
                .query({
                    f: 'check_email',
                    seq: 0,
                    sid_token: mailToken
                });
            if (result.body.list != undefined) {
                mail = result.body.list.filter(m => m.mail_subject == emailType && m.mail_from == 'email@domain.com' && m.mail_read == 0)[0];
            }
            else {
                mail = undefined;
            }
        }
        return mail.mail_id;
    }

Тем не менее, он имеет ограничение в 20 запросов в минуту, ограничение, которое приводит к сбою тестов.

Есть ли способ ограничить количество сделанных запросов?

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Я заставил это работать, создав задержку:

async delay(ms: number) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

и вызов его прямо перед выходом из цикла while:

await this.delay(5000);

Есть ли более чистый / приятный / эффективный / эффективный / и т.д. способ достижения этого?

1 Ответ

0 голосов
/ 07 сентября 2018

Этот ограничитель скорости, который я использовал в своих прошлых проектах Узкое место https://www.npmjs.com/package/bottleneck

const limiter = new Bottleneck({
  maxConcurrent: 20,
  minTime: 60000
});

while (!mail) {
  // set limiter here
  const result = await limiter.schedule(() => request(this.guerillaMailApiUrl)
    .get('')
    .query({
      f: 'check_email',
      seq: 0,
      sid_token: mailToken
    }));
  if (result.body.list != undefined) {
    mail = result.body.list.filter(m => m.mail_subject == emailType && m.mail_from == 'email@domain.com' && m.mail_read == 0)[0];
  } else {
    mail = undefined;
  }
}

Надеюсь, это поможет

...