cb(null, ...)

김동현·2024년 1월 3일
0

NodeJS

목록 보기
2/6
post-thumbnail

Callback

특정 라이브러리들의 소스 코드를 탐방하다 보면 cb(null, something) 과 같은 패턴을 종종 볼 수 있다.

npm queue

🧐 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(null, ...)

✅ 우리는 콜백 함수에서 에러가 발생할 경우 첫 번째 인자로 에러를 넘겨준 다는 것을 확인했다.

아래 비동기 코드를 한 번 보자

// 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) => {} 인 것은 다 이유가 있었다.

Express Error Handling

참고자료

https://github.com/expressjs/multer/issues/197
https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks

profile
달려보자

0개의 댓글