我是node和mongodb的新手,我正在尝试使用node更新mongo数据库中的用户密码。我收到以下错误 -
errmsg: 'After applying the update to the document {_id: ObjectId(\'5a4f50381a1152ec09277578\') , ...}, the (immutable) field \'_id\' was found to have been altered to _id: ObjectId(\'5a739493c592356f1b5a78b6\')'
}
models/accounts.js
中的代码是
AccountSchema.static('passchange', function (password, callback) {
var that = this;
if (typeof userobj!="undefined") {
console.log("User Object");
console.log(userobj._id); //I am getting the user id here
that.findOne({_id:userobj._id}, function (err, user) {
if (!user) {
console.log("No User");
return callback(null, false);
}
else
{
var salt = this.salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync(password, salt);
var updatepwd = new that({
salt: salt,
hash: hash
});
var conditions = { _id: userobj._id }
that.updateOne(conditions,updatepwd, function (err, savePassword) {
if (err)
{
console.log("err");
console.log(err);
return callback({err: err}, false);
} else {
console.log("savePassword._id");
console.log(savePassword._id);
//return callback(null, {_id : savePassword._id});
}
});
}
});
}
});
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:1)
为了记录解决方案:
根据评论中的讨论,问题似乎是原始文档被更新完全覆盖,而不是仅更新hash
和salt
字段。适当的解决方法是将updatepwd
值更新为以下内容:
var updatepwd: { $set: {
salt: salt,
hash: hash
}};
$set
运算符确保只更新salt
和hash
,因此_id
字段(以及其余数据)保持不变。
答案 1 :(得分:0)
您可能需要更新新运算符,因为当您不打算更改ID而只是密码时,您正在生成新ID。尝试遵循以下逻辑而不是新操作符。
items.forEach(function (product) { //update or create new products
// Es6 assign
var productToUpdate = {};
productToUpdate = Object.assign(productToUpdate, product._doc);
delete productToUpdate._id;
Product.findOneAndUpdate({product_id: product.product_id}, productToUpdate,
{upsert: true}, function (err) {
if (err) return updateDBCallback(err);
updateDBCallback(null, 'saved');
});
});