특정 라이브러리들의 소스 코드를 탐방하다 보면 cb(null, something)
과 같은 패턴을 종종 볼 수 있다.
🧐 cb(null, ...)은 무엇일까?
NodeJs Docs의 비동기와 콜백 부분을 살펴보자
Handling errors in callbacks
How do you handle errors with callbacks? One very common strategy is to use what Node.js adopted: the first parameter in any callback function is the error object: error-first callbacks
If there is no error, the object is null. If there is an error, it contains some description of the error and other information.
즉, err은 항상 콜백의 첫 번째 매개변수로, 오류가 발생했다면 오류의 내용을 첫 번째 매개 변수로 전달한다.
아래의 예시를 살펴보자
파일이 있을 경우
const fs = require("fs")
fs.readFile('./test.txt', function (err, file) {
console.log(err, "error") // null
console.log(file)
console.log(file.toString())
})
//test.txt
Hello World
파일이 없을 경우
const fs = require("fs")
fs.readFile('./tests.txt', function (err, file) {
console.log(err, "error")
console.log(file)
})
//test.txt
Hello World
✅ 우리는 콜백 함수에서 에러가 발생할 경우 첫 번째 인자로 에러를 넘겨준 다는 것을 확인했다.
아래 비동기 코드를 한 번 보자
// cb
function useCallback(cb) {
setTimeout(() => {
const random = Math.random();
if (random < 0.5) {
cb("error 입니다.");
}
cb(null, random);
}, 1000);
}
// try ... catch
function useCallback(cb) {
setTimeout(() => {
try {
const random = Math.random();
if (random < 0.5) {
throw new Error("에러입니다.");
}
cb(null, random);
} catch (error) {
cb(error);
}
}, 1000);
}
useCallback((err, res) => {
if (err) {
console.error("Error: ", err);
} else {
console.log("Result: ", res);
}
});
useCallback((error, result) => {
if (error) {
console.error("Error:", error.message);
} else {
console.log("Result:", result);
}
});
몇 번 실행해보면, 아래와 같은 결과들이 나온다!
useCallback((result) => {
console.log(result)
});
당연히 성공일 때 null이 반환될 것이다!
-> Nodejs가 채택한 방식을 활용하는 것이 Best Practice가 될 것 같다
NodeJS
는 비동기 처리를 할 때 콜백 함수
를 전달 받는다.
이 콜백 함수는 비동기 처리가 끝나면 실행되는 함수
이다.
NodeJS는 비동기 처리가 실패 했을 때 콜백 함수의 첫번 째 인자에 담아서 넘겨주는 방식을 채택했다. <- 이것은 약속이다!
대부분의 콜백 함수의 형태
가 (err, result) => {}
인 것은 다 이유가 있었다.
https://github.com/expressjs/multer/issues/197
https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks