discord bot을 만들어서 유저마다 특정 조건에 맞게 role을 정해주고 있었다. role 갱신을 할 때 기존에 부여된 role은 delete해주기 위한 코드를 작성하고 여러 개의 테스트를 실행했다.
그런데 응답으로 status 429, "message": "You are being rate limited.", "retry_after": 0.116이 왔다.
discord Rate Limits는 디스코드 API가 스팸, 남용, 서비스 과부하를 방지하기 위해 존재한다. 초당 50개 제한이라는데 50개의 테스트가 없음에도 429 응답이 왔다. 그래서 좋지 않은 방법이지만 테스트 속도를 늦춰서 우회하려고 했다.

arrow function에는 적용되지 않는 this를 사용하기 위해 익명 함수에 this.timeout을 사용했는데 동작하지 않았다.

not work

it('please delay seconds!', function () {
	this.timeout(1000);
})

그래서 setTimeout을 사용했는데 비동기적으로 실행이 되는 바람에 예상과는 다르게 나머지 로직이 실행된 뒤 2초 뒤에 setTimeout에 등록한 callback이 실행됐다.
그래서 await을 적용시켜서 setTimeout이 끝날 때까지 기다리려고 했다. 하지만 setTimeout은 Promise가 아니기 때문에 오류가 생겼다.
결론은 setTimeout을 Promise로 감싸서 인스턴스를 만들고 그 인스턴스를 await으로 기다리면서 호출하면 된다

it works!

beforeEach(async () => {
  const delayer = (sec: number) =>
  new Promise((resolve) => setTimeout(resolve, sec));
  await delayer(2000);
});
profile
서버 개발, 투자, 운동, 부자 되고 싶다

0개의 댓글