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

Mongoose中this.findOne不是函数问题求助(已导入Mongoose)

解决Mongoose静态方法中this.findOne不是函数的问题

以下是针对该问题的具体解决步骤:

1. 修正Schema拼写错误

你的代码里把UserSchema误写为UserShema(缺少字母c),这会导致静态方法挂载到了错误的对象上,进而引发this指向异常,找不到findOne方法。

2. 确保正确生成Model并调用静态方法

静态方法挂载到Schema后,必须通过mongoose.model()生成对应的Model,且只能通过Model本身调用该静态方法,不能直接调用Schema上的方法。

修正后的完整代码

const mongoose = require('mongoose')
const bcrypt = require('bcrypt')

// 定义正确的Schema结构
const UserSchema = new mongoose.Schema({
  username: String,
  password: String
  // 可添加其他业务字段
})

// 挂载静态登录方法
UserSchema.statics.login = async function(username, password){
    const user = await this.findOne({ username });

    if (user) {
        const auth = await bcrypt.compare(password, user.password);
        if (auth) {
          return user;
        }
        throw new Error('incorrect password');
      }
      throw new Error('incorrect username'); // 原错误提示与参数不符,建议统一
}

// 生成对应的Model
const User = mongoose.model('User', UserSchema)

// 正确调用方式示例
// User.login('testUser', 'testPassword')
//   .then(user => console.log(user))
//   .catch(err => console.log(err.message))

额外检查点

  • 禁止直接调用UserSchema.statics.login(),必须通过生成的User Model调用静态方法,否则this无法指向Model实例,找不到findOne方法。
  • 确认Schema中已定义username、password等查询所需的字段,避免查询无结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:07:01