Как обновить модель в mongoose с асинхронной проверкой (node /koa2)
Со стороны клиента, у пользователя есть форма для заполнения, где он может обновить либо свою электронную почту, либо пароль.
Они должны ввести свой текущий пароль для подтверждения запроса. После, если адрес электронной почты изменяется, должен запускаться валидатор электронной почты, чтобы проверить, что новый адрес электронной почты еще не зарегистрирован другим пользователем.
Итак, после того, как пользователь отправляет запрос со стороны клиента, я получаю следующую информацию:
{
userId: 'This is the ID of their entry in the database',
currentPassword: 'Current password to check against one stored in database',
newPassword: 'New password, will be blank if user has not requested a new password',
email: 'Email address, will be the same if user has not requested a new email'
}
Код в моем маршруте выглядит следующим образом;
const req = ctx.request.body;
const userId = ctx.request.body.userId;
const updateValues = (user, password, email) => {
let update = {};
if (user.email != email) {
update['email'] = email
}
if (password.length > 0) {
update['password'] = user.generateHash(password)
}
return update;
}
const opts = {
runValidators: true, context: 'query'
}
await User.findById(userId, async function (err, user) {
try {
await user.comparePassword(req['currentPassword'])
await User.update({_id: userId}, {$set: updateValues(user, req['newPassword'], req['email'])}, opts, (error) => {
console.log(error)
})
return ctx.body = {
message: 'User successfully modified',
user: user
}
}
catch (err) {
console.log(err)
ctx.body = {
err: err.message
}
}
И вот раздел электронной почты модели:
email: {
type: String,
required: true,
validate: {
validator: function (v, cb) {
this.model('User').find({email: v}, (err, docs) => {
cb(docs.length == 0, 'Email already taken!');
})
}
}
},
Здесь также есть функция comparePassword (хотя эта часть работает нормально);
UserSchema.methods.comparePassword = function (password) {
if (bcrypt.compareSync(password, this.password)) {
return this
}
else {
throw new Error('password\'s do not match')
}
}
Я пытался прочитать документы mongoose, чтобы понять это, и метод, показанный выше, представляет собой вариант того, что я читал в разделе "Документы", в разделе " Асинхронный пользовательский валидатор" и " Валидаторы обновлений" и в этом разделе.
В настоящее время я получаю следующую ошибку;
TypeError: Cannot use 'in' operator to search for '_id' in User
Я пробовал много разных вещей, в разной степени, но ни одна из них не сработала. Я надеюсь, что кто-то может указать мне правильное направление?