TypeError: Router.use() requires a middleware function but got a Object

henry·2024년 10월 1일

Error

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()에서 이를 정상적으로 미들웨어로 사용할 수가 있음.

0개의 댓글