API 엔드포인트에서 일정 시간이 지났을 때
에러 핸들링을 하고 싶을 수가 있다.
이러한 타임아웃 에러 핸들링을 도와주는 패키지가 있는데
connect-timeout
이다. 보통 express와 같이 사용된다고 한다.
// ...
import timeOut from "connect-timeout";
const app = express();
const main = () => {
app.use(timeOut("5s"))
app.listen(3000)
}
간단한 예시이다.
5초 후 응답값이 없으면 타임아웃 에러를 발생한다.
내부 코드를 살펴보면
setTimeout을 통해 일정 시간이 지나면 이벤트리스너를 사용해 에러 발생 시킨다.
https://github.com/expressjs/timeout/blob/master/index.js#L49...L53
특정 API에서 시간제한을 제거할 수 있도록 req.clearTimeout
을 제공한다.
https://github.com/expressjs/timeout/blob/master/index.js#L56...L58
onHeaders라는 패키지를 사용한다. 이 패키지는 응답이 완료되었고 헤더가 전송되기 전을 캐치하여
setTimeout
을 제거하도록 res.writeHead
를 덮어쓴다.
https://github.com/jshttp/on-headers/blob/master/index.js#L65
덮어쓰지 않으면 이미 헤더가 전송 되었는데 또 전송하게 되어서
`Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client`
와 같은 에러를 볼수 있다.