我们正在将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@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);
是否有一种更清洁/更精细/效率更高/性能更高的方法来实现这一目标?
答案 0 :(得分:0)
我在过去的项目中使用过的一个限速器 Bottleneck 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;
}
}
希望有帮助