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
相关产品推荐
相关产品推荐

