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

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和实际文件路径一致,重点检查:

    1. 存放模型的文件夹是model还是复数models,拼写和路径保持一致
    2. 文件名大小写是否匹配,比如实际文件是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:05