NextAuth使用时查询MongoDB User模型提示findOne不是函数如何解决
报错根本原因
该报错的核心是你导入的Users对象不是合法的Mongoose模型实例,因此没有继承Mongoose挂载的findOne查询方法。
排查修复步骤
第一步:核对User模型的导出逻辑
绝大多数该报错都是/model/user.js文件的导出写法错误导致的,必须兼容Next.js热重载特性,避免模型重复注册,正确写法参考:import mongoose from "mongoose"; const userSchema = new mongoose.Schema({ // 你的自定义字段,例如: name: String, email: { type: String, unique: true }, password: String }); // 必须先判断模型是否已存在,避免热重载重复注册 export default mongoose.models.User || mongoose.model("User", userSchema);同时要确认你是
default默认导出还是命名导出:如果是export const User = xxx的命名导出,导入时需要用import { User } from '../../../model/user'的写法,不能省略大括号。第二步:校验导入路径正确性
确认你的导入路径../../../model/user和实际文件路径一致,重点检查:- 存放模型的文件夹是
model还是复数models,拼写和路径保持一致 - 文件名大小写是否匹配,比如实际文件是
User.js的话,路径要写../../../model/User,Windows环境大小写不敏感,部署到Linux环境会直接报错
- 存放模型的文件夹是
第三步:确认API路由运行时配置
Mongoose不支持Next.js的Edge Runtime,必须指定使用Node.js运行时,在你的API文件顶部添加如下配置:export const runtime = 'nodejs';第四步:验证导入对象有效性
在调用findOne前临时添加打印代码,确认导入的对象是Mongoose模型:import Users from '../../../model/user'; console.log('导入的Users对象:', Users); // 输出包含model、findOne等方法才是正常的如果输出为undefined、Schema对象,直接定位是导出/导入环节的问题。
第五步:避免和NextAuth模型冲突
如果你使用了NextAuth的Mongoose适配器,适配器会自动生成User模型,要确保你自定义的User模型和适配器的模型字段兼容,且导出时的重复注册判断逻辑正常生效。
内容的提问来源于stack exchange,提问作者Gourav Bhardwaj
相关产品推荐
相关产品推荐

