在验证前挂钩中的猫鼬无效不会引发错误

时间:2018-10-25 15:02:36

标签: javascript node.js mongoose async-await mongoose-schema

我的用户模型中具有以下预验证钩子:

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之后,所以我不明白为什么会有没有引发错误。

我在其他一些模型中成功使用了相同的钩子,操作更加复杂,没有错误。

我真的不明白为什么这个不起作用

2 个答案:

答案 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
}