我们正在使用supertest和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 protected]' && 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);
是否有更清洁/更好/更有效/高性能/等方式实现这一目标?
我在过去的项目瓶颈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 protected]' && m.mail_read == 0)[0];
} else {
mail = undefined;
}
}
希望能帮助到你