这是我的createUpdate函数
const createUpdateProfile = (req, res) => {
//Fillout Schema
let uuid = req.user.identities[0].id;
let provider = req.user.identities[0].provider;
let email = req.user.email;
let firstName = req.user.name.split(' ').slice(0, -1).join(' ');
let lastName = req.user.name.split(' ').slice(-1).join(' ');
let pictureUrl = req.user.picture;
let profileToSafe = new Profile({
uuid: uuid,
provider: provider,
email: email,
firstName: firstName,
lastName: lastName,
pictureUrl: pictureUrl
});
let profileToUpdate = new Profile({
email: email,
firstName: firstName,
lastName: lastName,
pictureUrl: pictureUrl
});
//createUpdate
Profile.findOne({ uuid }).then(object => {
if (object !== null) {
Profile.findByIdAndUpdate(object._id, profileToUpdate, function (err, raw) {
if (err) {
console.log('callback -> err', err);
}
console.log('callback -> raw', raw);
res.status(200).send('successful operation update');
});
} else {
profileToSafe.save();
res.status(200).send('successful operation create');
}
})
}
尽管更新了现有记录,但一切正常。
问题在于此代码区域:
Profile.findByIdAndUpdate(object._id, profileToUpdate, function (err, raw) {
if (err) {
console.log('callback -> err', err);
}
console.log('callback -> raw', raw);
res.status(200).send('successful operation update');
});
我不知道为什么,但是它试图覆盖_id字段,即使它没有在profileToUpdate架构中定义。
答案 0 :(得分:1)
阅读this后,确实有用。
诀窍是在尝试更新之前手动删除id。
Profile.findOne({ uuid }).then(object => {
if (object !== null) {
var upsertData = profileToUpdate.toObject();
delete upsertData._id;
Profile.update({ uuid }, upsertData, { upsert: true }, function (err, raw) {
if (err) {
console.log('callback -> err', err);
}
console.log('callback -> raw', raw);
res.status(200).send('successful operation update');
});
} else {
profileToSafe.save();
res.status(200).send('successful operation create');
}
})