mongoose 静态函数中的数据库查询导致程序无限期等待

kninwzqo  于 2023-06-30  发布在  Go
关注(0)|答案(1)|浏览(72)

我跟随youtube教程(https://www.youtube.com/watch?v=mjZIv4ey0ps&list=PL4cUxeGkcC9g8OhpOZxNdhXggFz2lOuCT&index=3&t=597s)制作登录和授权系统,并提供了我坚持的部分的链接。您可以看到,当我从Schema文件中创建的静态方法中调用this.findOne({})函数时,程序开始无限期等待,并且不再运行任何代码。模型的代码是

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

const userSchema = new Schema({
    email: {
        type: String,
        required: true,
        unique: true,
    },
    password: {
        type: String,
        required: true
    }
})
userSchema.statics.signup = async (email, password) => {
    console.log("Static Method Triggered")
    const exists = await this.findOne({ email })
    console.log("Verifying existence")

    if (exists) {
        throw Error("Email is already in use")
    }
    console.log("Existence verified")

    const salt = await bcrypt.genSalt(5)
    const hash = await bcrypt.hash(password, salt)
    console.log(hash)
    const user = await this.create({ email: email, password: hash })
    console.log("End of function")
    return user
}

module.exports = mongoose.model('User', userSchema)

正如您所看到的,我有日志语句来查看程序的执行情况。我在控制台中得到了“静态方法触发”语句,但没有“验证存在”语句或任何后续语句。这意味着程序在const exists = await this.fineOne({email})行无限期等待。
我试过用find代替findOne,结果一样。对数据库的其他查询也可以工作,所以这不是mongodb Atlas的问题。只有自定义函数(静态方法)存在此问题。我试着编辑语句

findOne({email: email})

结果还是一样。完全删除这些语句会导致运行salt和hash语句,并记录哈希,但随后程序又开始在

const user = await this.create({email: email, password: hash})

如果我执行console.log(this),它将返回空大括号{}。我做错了什么。我是否错过了教程中的某个步骤?

dphi5xsq

dphi5xsq1#

this关键字在箭头函数() => {}中的工作方式不同。因此,请使用常规函数function(){}
更新代码:

userSchema.statics.signup = async function(email, password) {
    console.log("Static Method Triggered")
    const exists = await this.findOne({ email })
    console.log("Verifying existence")

    if (exists) {
        throw Error("Email is already in use")
    }
    console.log("Existence verified")

    const salt = await bcrypt.genSalt(5)
    const hash = await bcrypt.hash(password, salt)
    console.log(hash)
    const user = await this.create({ email: email, password: hash })
    console.log("End of function")
    return user
}

希望这个能帮上忙

相关问题