这是我的前端代码。最初,当令牌存在于本地存储中时,我从令牌中获取用户,然后更新用户的代码和获取数据库中的用户的操作
let token = JSON.parse (localStorage.getItem ('token'));
async function addtoWishlist (id) {
let temp = await findId ();
let user = await temp.json ();
let wishlistArray = user.wishItems;
console.log ('wishlistArray:', wishlistArray);
wishlistArray.push (id);
let dts = {
wishItems: wishlistArray,
};
let data_to_send = JSON.stringify (dts);
fetch (`http://localhost:2233/*/user/add`, {
method: 'PATCH',
body: data_to_send,
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
})
.then (k => {
return k.json ();
})
.then (res => {
console.log (res);
})
.catch (err => {
console.log (err);
});
}
async function findId () {
let user = await fetch (`http://localhost:2233/*/user`, {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
});
return user;
}
控制器代码
app.get ('/*/user', authenticate, async (req, res) => {
const user = req.user.user;
return res.send (user);
});
app.patch ('/*/user/add', authenticate, async (req, res) => {
try {
console.log ('inside patch');
let user = req.user.user;
console.log ('user:', user);
console.log (req.body);
user = await User.findByIdAndUpdate (user._id, req.body, {
new: true,
})
.lean ()
.exec ();
console.log ('after-user', user);
return res.send (user);
} catch (e) {
return res.send (e.message);
}
});
用户模式如下所示
const userSchema = new Schema (
{
fullName: {type: String, required: false},
email: {type: String, required: true},
password: {type: String, required: true},
username: {type: String, required: true},
mobile: {type: Number, required: true},
description: {type: String, required: true},
bagItems: [
{
productId: {
type: Schema.Types.ObjectId,
ref: 'product',
required: false,
},
count: {type: Number, required: false},
},
],
wishItems: [
{
type: Schema.Types.ObjectId,
ref: 'product',
},
],
},
{
versionKey: false,
timestamps: true,
}
);
**每当我将项目添加到心愿单中时,它就会替换已经存在的项目
您需要使用$push运算符
user = await User.findByIdAndUpdate (user._id, { $push: req.body }, { ...
确保req.body
只有wishItems
属性,而没有其他属性。