我跟随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),它将返回空大括号{}。我做错了什么。我是否错过了教程中的某个步骤?
1条答案
按热度按时间dphi5xsq1#
this
关键字在箭头函数() => {}
中的工作方式不同。因此,请使用常规函数function(){}
。更新代码:
希望这个能帮上忙