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

Express.js(ES6)中Mongoose model.find报错:Cannot read property 'find' of undefined

解决TypeError: Cannot read property 'find' of undefined问题

这个问题我熟!核心原因是你的模型导出和控制器导入方式不匹配,导致UserModel变成了undefined,自然调用不了find方法。来一步步解决:

方案1:修正控制器的导入方式(推荐,适配现有模型代码)

你的模型用的是默认导出(export default),但控制器里误用了解构语法导入,这两种方式不兼容。把控制器的导入语句改成下面这样:

// 控制器代码修正后
import UserModel from './model' // 去掉花括号,直接导入默认导出的模型

export async function getUser(req,res){ // 记得加上export,不然路由无法调用这个函数
  try {
    const result = await UserModel.find(); // 用async/await替代回调,更符合你声明的async函数
    res.status(200).json(result);
  } catch (err) {
    console.log("Error",err);
    res.status(500).json({ error: err.message });
  }
}

方案2:修改模型为命名导出(如果习惯用解构导入)

如果你更倾向于保持控制器的解构导入写法,可以把模型的导出改成命名导出:

// 模型代码修正后
import mongoose from 'mongoose';
const Schema = mongoose.Schema;
const userSchema = new Schema({
  name: String,
  email: String,
  provider:String,
  role:String
});
export const UserModel = mongoose.model('user',userSchema); // 命名导出

这样控制器原来的import {UserModel} from './model'就能正常工作了,同样记得给getUser函数加上export关键字。

为啥会出错?

简单说:

  • 默认导出(export default)的模块,导入时不需要花括号,直接用import 变量名 from 路径
  • 命名导出(export const xxx)的模块,才用import {xxx} from 路径的解构语法

你之前的写法把这两种导出导入方式混在一起,导致UserModel没有被正确加载,自然就会出现“无法读取undefined的find属性”的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:43