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;
이렇게 작성하니 제대로 실행된다.
node.js에서 모듈을 export
하는 구문에 대해 이해가 부족하다고 느껴서 찾아봤다.
node.js에서는 모듈을 불러오기 위해 require()
함수를 쓴다.
require()
함수의 파라미터로 해당 모듈의 파일 경로를 불러오게 되는데, 그 이유는 런타임 시 해당 파일(모듈) 안의 key
, value
값이 객체로 저장되고 require()
는 이를 불러오게 되기 때문이다.
require()는 module.exports
를 리턴한다.
그렇다면 module.export
와 exports
의 차이는 무엇일까?
공식문서에 따르면 exports
는 module.exports
를 참조한다.
따라서 exports
앞에 module
이 생략된 것이라고 보면 된다.
그러니 다음과 같이 작성해도 코드는 정상 작동한다.
module.exports.routes = router;
module.exports.products = products;
다시 처음에 발생했던 에러로 되돌아가보면, 여기서 module
이 아니라 exports
를 생략해버렸으니 당연히 node.js가 router
를 찾지 못하는 에러가 발생한 것이다.