안녕하세요
express 라우터에 async-await 사용하기. next() 메서드 본문
1. async-await 를 사용하려면 콜백함수에 async 쓰면 된다.
const app = express();
// 비동기 작업을 처리하는 함수
const asyncFunction = () => {
// 비동기 작업 수행
const result = await someAsyncOperation();
return result;
}
// 라우트 핸들러에서 async/await를 사용하는 방법
app.get('/example', async (req, res) => {
const result = await asyncFunction();
res.send(result);
}
});
2. try-catch로 에러가 발생하면 잡아준다???
const app = express();
// 비동기 작업을 처리하는 함수
const asyncFunction = () => {
// 비동기 작업 수행
const result = await someAsyncOperation();
return result;
}
// 라우트 핸들러에서 async/await를 사용하는 방법
app.get('/example', async (req, res) => {
try {
const result = await asyncFunction();
res.send(result);
} catch (err) {
console.error(err);
res.status(500).send('에러 발생');
}
});
=> 라우터에서 error가 발생하면 서버가 compile을 하지 못하고 그대로 종료되어 버리기 때문에
비동기 처리의 결과가 error를 던지지 않도록 해야한다.
3. try-catch의 결과를 출력해주는 함수를 만들기
const tryCatchWrapper = (asyncFunction) => {
return async (req, res, next) => {
try {
return await asyncFunction(req, res, next);
} catch (error) {
return next(error);
}
};
};
next() 메서드
async 함수에서 next() 메서드는 현재 async 함수를 종료하고 다음 미들웨어 함수로 제어를 넘기는 역할을 합니다.
next() 메서드는 보통 다음 미들웨어 함수를 호출하는 역할을 합니다.
next() 메서드는 다음 미들웨어 함수의 실행 결과를 기다릴 수 있습니다.
이를 위해서는 next() 메서드에 await 키워드를 사용하여 반환값을 받아야 합니다.
하지만, 만약 에러가 발생하면 next() 메서드에 에러 객체를 전달하여 에러 핸들링 미들웨어를 호출할 수 있습니다.
위 예시에서 try-catch 구문을 사용하여 에러를 처리하고, next() 메서드에 에러 객체를 전달합니다.
이렇게 함으로써, 에러 핸들링 미들웨어 함수에서 에러 객체를 받아 처리할 수 있습니다.
const cha = async () => {
throw new Error("cha error");
return await db.collection("channels").find().toArray();
};
app.get("/api/channels", wrapper(async (request, response, next) => {
const channelIdArray = await cha();
response.json(channelIdArray);
console.log("/api/channels 접속");
})
);
=> error를 발생시키면 express가 종료되지 않는다.
next(error) 메서드가 error를 출력하고, 다음 미들웨어를 호출하여 흐름이 이어지도록 한다.
Error: cha error
at cha (C:\Users\...\server.js:81:9)
=> 이와 같은 에러가 콘솔창에 출력된다.
'유튜브컨텐츠탐색-StelLife' 카테고리의 다른 글
이벤트 버블링 막기: event.stopPropagation() (0) | 2023.03.11 |
---|---|
filter 기능 구현: 할 때 목록을 state로 만들 필요는 없다. (0) | 2023.03.11 |
특정 시간에 API로 받아온 데이터를 DB에 업데이트 (0) | 2023.02.18 |
Youtube API Search로 검색한 자료 일자별로 구분하기 (0) | 2023.02.15 |
프로젝트(3) - Koyeb 배포, 환경변수, websocket connection to failed Error (0) | 2023.02.08 |