내일배움캠프 TIL (230126)

Jiumn·2023년 1월 26일
0

Router.use() requires a middleware function but got a undefined 에러

node.js에는 module을 내보내는 구문이 여러가지인데,
기존의 module.exports = router를 변경하면서 발생하면서 에러가 발생했다.

Router.use() requires a middleware function but got a undefined 

변경한 모듈 export 구문을 다시 살펴봤다.

products 마우스오버 시에 any가 뜨는 걸 보아 모듈을 내보내는 구문이 잘못됐다는 생각이 들었다.

해결방법

exports.routes = router;
exports.products = products;

이렇게 작성하니 제대로 실행된다.


module.exports와 exports의 차이


node.js에서 모듈을 export하는 구문에 대해 이해가 부족하다고 느껴서 찾아봤다.

node.js에서는 모듈을 불러오기 위해 require()함수를 쓴다.
require() 함수의 파라미터로 해당 모듈의 파일 경로를 불러오게 되는데, 그 이유는 런타임 시 해당 파일(모듈) 안의 key, value 값이 객체로 저장되고 require()는 이를 불러오게 되기 때문이다.

require()는 module.exports를 리턴한다.
그렇다면 module.exportexports의 차이는 무엇일까?

공식문서에 따르면 exportsmodule.exports를 참조한다.
따라서 exports 앞에 module이 생략된 것이라고 보면 된다.

그러니 다음과 같이 작성해도 코드는 정상 작동한다.

module.exports.routes = router;
module.exports.products = products;

다시 처음에 발생했던 에러로 되돌아가보면, 여기서 module이 아니라 exports를 생략해버렸으니 당연히 node.js가 router를 찾지 못하는 에러가 발생한 것이다.

profile
Back-End Wep Developer. 꾸준함이 능력이다.

0개의 댓글