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

创建Node.js Express应用遇Router.use()中间件类型错误求助

排查Express中Router.use() requires a middleware function but got a [type]错误

嘿,这个错误我开发Express应用时碰过好多次了,核心问题就是你给Router.use()或者app.use()传的不是一个合法的中间件函数/路由实例。我给你列几个最常见的排查方向,按优先级来:


1. 先检查路由模块的导出是否正确

这是最容易踩的坑!比如你写了一个路由文件(比如routes/posts.js),最后忘记正确导出Express的Router实例,或者导出格式错了:

错误示例1:没导出Router

// routes/posts.js
const express = require('express');
const router = express.Router();

// 定义路由...
router.get('/', (req, res) => { res.send('Posts list') });

// 这里漏了导出!

错误示例2:导出成了对象

// routes/posts.js
// ... 上面的代码
module.exports = { router }; // 导出了包含router的对象,不是router本身

正确的导出方式

// routes/posts.js
// ... 上面的代码
module.exports = router; // 直接导出Router实例

然后在server.js里导入后挂载:

const postRoutes = require('./routes/posts');
app.use('/posts', postRoutes); // 这里传的是正确的路由实例

2. 检查挂载路由/中间件时的参数

你可能不小心把非函数值传给了use()方法:

  • 比如导入路由时路径写错了,导致拿到undefined:
    // 错误:路径拼写错误,文件不存在,返回undefined
    const userRoutes = require('./routes/uesrs'); // 注意拼写错误
    app.use('/users', userRoutes); // 传了undefined,自然报错
    
  • 或者误传了字符串、数字之类的非函数值:
    // 错误:把字符串当中间件传了
    app.use('/api', 'some random string');
    

3. 检查自定义中间件的定义

如果是自己写的中间件,要确保它符合Express的中间件签名:(req, res, next) => { ... },而且必须是一个函数:

// 错误示例:中间件不是函数
const badMiddleware = 'this is not a function';
app.use(badMiddleware);

// 错误示例:中间件签名不对(没处理next)
const incompleteMiddleware = (req, res) => {
  // 没调用next(),若误写成非函数也会触发报错
};

4. 检查第三方中间件的使用

有些第三方中间件需要先调用(执行工厂函数)才能得到合法的中间件,比如express.json()、express.urlencoded():

// 错误:传了工厂函数本身,不是执行后的中间件
app.use(express.json);

// 正确:调用后得到中间件函数
app.use(express.json());

如果排查完这些还没解决,可以把你的server.js和相关路由文件的关键代码贴出来,但根据你给出的错误信息,90%的概率是路由导出/导入的问题。

内容的提问来源于stack exchange,提问作者Swapnil Deo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:10:35