Express路由报Router.use()需中间件函数却得到Object错误,如何解决?
问题原因
你遇到的TypeError: Router.use() requires a middleware function but got a Object错误,本质是apiRouter.use()接收的minionsRouter/ideasRouter/meetingsRouter不是有效的Express Router实例,而是空对象,触发原因有两个核心问题:
- 文件名大小写不匹配:你的路由文件命名为
Minions.js(首字母大写),但在API.js中引入时写的是require('./minions')(全小写),在大小写敏感的操作系统(Linux、macOS默认文件系统)中,会找不到对应文件,引入结果为空对象。 - 路由文件导出顺序不规范:你在
Minions.js中刚创建Router实例就直接导出,虽然JavaScript引用类型的特性不会导致后续绑定的路由丢失,但不符合模块导出规范,容易在后续修改代码时踩坑。
解决方案
- 第一步:统一文件名和引入路径的大小写,将
Minions.js重命名为minions.js,同理确认ideas.js、meetings.js的文件名和API.js中require的路径完全一致。 - 第二步:调整所有路由文件的导出位置,将
module.exports放到文件末尾,修改后的minions.js示例如下:
const minionsRouter = require('express').Router(); const { getAllFromDatabase, addToDatabase, getFromDatabaseById, updateInstanceInDatabase, deleteFromDatabasebyId, } = require('./db.js'); minionsRouter.get('/', (req, res, next) => { const minionsArray = getAllFromDatabase('minions'); if (minionsArray) { res.status(200).send(minionsArray); } else { res.status(404).send(); } }); // 导出放到代码最后 module.exports = minionsRouter;
- 第三步:检查
ideas.js、meetings.js两个文件,确认均按上述规范导出了有效的Router实例,没有缺失导出的问题。 - 调试兜底方案:如果修改后仍报错,可以在
API.js中引入路由后加一行打印console.log(minionsRouter),如果输出为空对象,再核对路径、文件名、导出逻辑即可定位问题。
内容的提问来源于stack exchange,提问作者Maurice Markslag
相关产品推荐
相关产品推荐

