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

ES6改造Node.js项目时Express Router及Mongoose模型调用报错排查

问题解决方案

第一个报错:TypeError: Router.use() requires a middleware function but got a Module

原因

核心问题是导入Express Router时未正确获取默认导出的路由实例,而是拿到了整个模块对象;另外项目未启用ES6模块支持也会引发这类语法兼容问题。

解决方案

  1. 启用ES6模块支持:在项目根目录的package.json中添加"type": "module"字段,告知Node.js使用ES6模块语法:
{
  "type": "module",
  // 其他原有配置...
}
  1. 匹配默认导出的导入方式:
    如果你的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模型实例,通常是模型的导出/导入方式错误,或模型定义本身存在问题。

解决方案

  1. 确认模型的正确导出:
    在models/article.js中,确保默认导出Mongoose模型:
// models/article.js
import mongoose from 'mongoose';

const articleSchema = new mongoose.Schema({
  // 字段定义...
});

// 导出模型实例而非Schema
export default mongoose.model('Article', articleSchema);
  1. 正确导入模型:
    在路由文件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 });
});
  1. 排查模型定义问题:
    若上述步骤仍报错,检查模型定义是否存在拼写错误(如mongoose.Schema误写为mongoose.schema),或是否误导出了Schema对象而非模型实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:57:37