node.js와 express를 학습하기 위한 간단한 웹 애플리케이션을 생성하는 과정에서 발생한 에러.
TypeError: Router.use() requires a middleware function but got a Object

이 오류는 보통 app.use()에 잘못된 인자를 전달했을 때 발생하는데, 미들웨어 함수 대신 객체(Object)가 전달되었을 때 발생
app.js와 users.js라는 두 파일을 통해, 사용자의 회원가입, 로그인, 비밀번호 초기화 요청 등을 처리
app.js
const express = require('express');
const app = express();
const dotenv = require('dotenv');
dotenv.config();
app.listen(process.env.PORT, () => {
console.log('Server on port number : 3000.');
});
const userRouter = require('./routes/users');
app.use('/', userRouter);
users.js
const express = require('express');
const router = express.Router();
router.post('/join', (req, res) => {
res.json('회원가입');
});
router.post('/login', (req, res) => {
res.json('로그인');
});
router.post('/reset', (req, res) => {
res.json('비밀번호 초기화 요청');
});
router.put('/reset', (req, res) => {
res.json('비밀번호 초기화');
});
./routes/users.js 파일에서 module.exports = router; 구문을 생략하거나 올바르게 작성하지 않으면
라우터 객체가 제대로 내보내지지 않아서 app.js 파일에서 userRouter로 받은 값이 라우터 객체가 아닌 일반 객체로 해석
이로 인해 app.use()에서 해당 에러가 발생.
./routes/users.js 파일에서 userRouter를 사용할 수 있도록 내보내는 것
const express = require('express');
const router = express.Router();
router.post('/join', (req, res) => {
res.json('회원가입');
});
router.post('/login', (req, res) => {
res.json('로그인');
});
router.post('/reset', (req, res) => {
res.json('비밀번호 초기화 요청');
});
router.put('/reset', (req, res) => {
res.json('비밀번호 초기화');
});
module.exports = router;
문제의 핵심은 module.exports를 사용하여 라우터 객체를 제대로 내보내지 않아서 에러 발생.
라우터를 올바르게 내보내면 app.use()에서 이를 정상적으로 미들웨어로 사용할 수가 있음.