ES6改造Node.js项目时Express Router及Mongoose模型调用报错排查
问题解决方案
第一个报错:TypeError: Router.use() requires a middleware function but got a Module
原因
核心问题是导入Express Router时未正确获取默认导出的路由实例,而是拿到了整个模块对象;另外项目未启用ES6模块支持也会引发这类语法兼容问题。
解决方案
- 启用ES6模块支持:在项目根目录的
package.json中添加"type": "module"字段,告知Node.js使用ES6模块语法:
{ "type": "module", // 其他原有配置... }
- 匹配默认导出的导入方式:
如果你的routes/article.js是如下导出逻辑:
// routes/article.js import { Router } from 'express'; const router = Router(); // 路由逻辑定义... export default router;
那么在server.js中必须使用默认导入获取路由实例:
// server.js import express from 'express'; import articleRouter from './routes/article.js'; // 无花括号的默认导入 const app = express(); app.use('/articles', articleRouter); // 传入路由函数而非模块对象
错误示例:若使用
import { router } from './routes/article.js'或import * as articleRouter from './routes/article.js',会导致传入Router.use()的是模块对象而非路由函数,触发报错。
第二个报错:TypeError: Article.find is not a function
原因
该错误说明导入的Article不是有效的Mongoose模型实例,通常是模型的导出/导入方式错误,或模型定义本身存在问题。
解决方案
- 确认模型的正确导出:
在models/article.js中,确保默认导出Mongoose模型:
// models/article.js import mongoose from 'mongoose'; const articleSchema = new mongoose.Schema({ // 字段定义... }); // 导出模型实例而非Schema export default mongoose.model('Article', articleSchema);
- 正确导入模型:
在路由文件routes/article.js中,用默认导入获取模型:
// routes/article.js import Article from '../models/article.js'; // 正常调用模型方法示例 router.get('/', async (req, res) => { const articles = await Article.find(); res.render('articles/index', { articles }); });
- 排查模型定义问题:
若上述步骤仍报错,检查模型定义是否存在拼写错误(如mongoose.Schema误写为mongoose.schema),或是否误导出了Schema对象而非模型实例。
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

