我的用户模型中具有以下预验证钩子:
UserSchema.pre<IUser>('validate', async function (next: NextFunction): Promise<void> {
if (!this.isModified('password')) {
return next()
}
if (this.password.length < 8) {
this.invalidate(
'password',
'Invalid password ...',
''
)
console.log(this.password)
}
this.password = await bcrypt.hash(this.password, 12)
})
架构为:
const UserSchema: mongoose.Schema = new mongoose.Schema({
login: {
required: true,
type: String,
unique: 'Le nom d\'utilisateur `{VALUE}` est déjà utilisé'
},
mail: {
required: true,
type: String,
unique: 'Le mail `{VALUE}` est déjà utilisé'
},
password: { required: true, type: String, /*select: false*/ },
// In test env auto validate users
isVerified: { type: Boolean, default: config.env !== 'test' ? false : true },
profilPic: { type: mongoose.Schema.Types.ObjectId, ref: 'Image' },
}, { timestamps: true })
但是做
try {
await User.create({ login: 'user2', mail: 'user1@mail.com', password: '123' })
} catch (error) {
console.log(error)
}
我有一个日志123
,它指示代码在前钩中的第二个if
中输入,但是由于该日志位于this.invalidate
之后,所以我不明白为什么会有没有引发错误。
我在其他一些模型中成功使用了相同的钩子,操作更加复杂,没有错误。
我真的不明白为什么这个不起作用
答案 0 :(得分:0)
猫鼬middleware documentation并未将create列为受支持的操作。您尝试过保存吗?
答案 1 :(得分:0)
这种行为的背景是Document.prototype.invalidate()
不会抛出错误-它返回错误。为了停止当前中间件链的执行,您需要调用next
并将此错误传递给它:
if (this.password.length < 8) {
const validationError = this.invalidate(
'password',
'Invalid password ...',
''
);
next(validationError);
console.log(this.password); // Won't run
}
或throw
:
if (this.password.length < 8) {
const validationError = this.invalidate(
'password',
'Invalid password ...',
''
);
throw validationError;
console.log(this.password); // Won't run
}