You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用app.use()初始化路由时遭遇Router.use()类型错误求助

解决Express中"Router.use() requires a middleware function but got a Object"错误

嘿,这个坑我之前踩过!你猜的没错,这个错误100%是路由模块的导出方式不对导致的。Express的app.use()(或者Router.use())要求传入的是一个中间件函数,或者是一个Express Router实例,但你现在导出的是一个普通对象,所以框架就报错了。

最常见的错误场景

比如你在路由文件里可能这么写了:

// ./routes/user.js 错误示例
const express = require('express');
const router = express.Router();

router.get('/profile', (req, res) => {
  res.send('用户主页');
});

// 错误:导出了包含router的对象,而不是router本身
module.exports = { router };

然后在主文件里引入时,你拿到的是一个{ router: Router实例 }的对象,把这个对象传给app.use(),自然就不符合要求了。

正确的写法应该是这样

直接导出Router实例本身:

// ./routes/user.js 正确示例
const express = require('express');
const router = express.Router();

router.get('/profile', (req, res) => {
  res.send('用户主页');
});

// 直接导出router实例
module.exports = router;

如果你的项目用的是ES模块(import/export语法),也要注意:

  • 错误写法:export default { router };
  • 正确写法:export default router;

另一种可能的错误场景

如果你的路由文件根本没创建Router实例,而是直接导出了一堆零散的处理函数,比如:

// 错误示例:没有用Router封装路由
module.exports = {
  homeHandler: (req, res) => res.send('首页'),
  aboutHandler: (req, res) => res.send('关于我们')
};

这种情况要改成用Router实例封装所有路由逻辑,再导出实例,就像上面的正确示例那样。

最后检查主文件的引入

确保你在主文件里拿到的是正确的Router实例:

// 主文件(比如server.js)
const express = require('express');
const app = express();
// 这里引入的是Router实例,不是对象
const userRouter = require('./routes/user');

// 正确传入Router实例给app.use()
app.use('/users', userRouter);

按照这个思路检查一遍你的代码,应该就能解决问题啦!

内容的提问来源于stack exchange,提问作者alt-rock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:38