Недействительный Mongoose в хуке pre validate не вызывает ошибку - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая ловушка предварительной проверки в моей модели пользователя:

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)
}

Iесть журнал 123, который указывает, что код входит во второй if в предварительном хуке, но поскольку журнал идет после this.invalidate, я не понимаю, почему не выдается ошибка.

Я успешно использовал тот же хук в некоторых других моделях с более сложными операциями без ошибок.

Я действительно не понимаю, почему этот не работает

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Фон такого поведения состоит в том, что 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 it:

if (this.password.length < 8) {
    const validationError = this.invalidate(
        'password',
        'Invalid password ...',
        ''
    );
    throw validationError;
    console.log(this.password); // Won't run
}
0 голосов
/ 25 октября 2018

Mongoose документация по промежуточному программному обеспечению не перечисляет создание как поддерживаемую операцию.Вы пытались сохранить?

...