我正在尝试在后端使用MongoDB,Express和GraphQL(Apollo客户端/服务器)创建一个电子商务应用程序,但是我在让用户向其存储在数据库中的购物车中添加某些内容时遇到问题。
到目前为止,我的数据库中有三个模型:User
,Item
,CartItem
。
我遇到的问题是我有一个用户模型,该用户模型具有一个cart
字段,该字段是CartItem的数组。
然后我有了一个CartItem模型,该模型具有item
(在购物车中将cartItem
映射到原始Item
)和user
引用。
从前端启动Mutation后,如果服务器上没有addtoCart
,则我有一个CartItem
解析器,它会创建一个新的CartItem
或user.id
或仅更新item.id
的数量(如果确实存在)。
CartItem
这很好,可以添加新的addToCart: async (_, { id }, ctx) => {
// 1. make sure they are signed in
const { userId } = ctx.req;
if (!userId) {
throw new Error('You must be signed in!');
}
// 2. query the users current cart
const existingCartItem = await CartItem.findOne({
user: userId,
item: id
});
// 3. check if that item is already in their cart and if it is increment by 1
if (existingCartItem) {;
return CartItem.findOneAndUpdate({
_id: existingCartItem.id,
}, {
$set: {
quantity: existingCartItem.quantity + 1
}
});
}
// 4. if its not, create a fresh CartItem for that user
return CartItem({ user: userId, item: id }).save();
}
并更新数量(如果已经存在)。但是CartItem
的{{1}}字段未与cart
的{{1}}更新。因此,我在解析器中添加了另一行以更新User
并将id
推入CartItem
数组中。
User
执行此操作时,服务器开始冻结,并且所有API调用都停止运行,并且基本上中断了应用程序,没有错误,我可以看到。如果我删除了用于更新cartItem.id
API的代码,则该调用将再次起作用,但返回到cart
不会被更新。我想念什么吗?
userSchema看起来像这样:
addToCart: async (_, { id }, ctx) => {
// 1. make sure they are signed in
const { userId } = ctx.req;
if (!userId) {
throw new Error('You must be signed in!');
}
// 2. query the users current cart
const existingCartItem = await CartItem.findOne({
user: userId,
item: id
});
// 3. check if that item is already in their cart and if it is increment by 1
if (existingCartItem) {
return CartItem.findOneAndUpdate({
_id: existingCartItem.id,
}, {
$set: {
quantity: existingCartItem.quantity + 1
}
});
}
// 4. if its not, create a fresh CartItem for that user
const cartItem = await CartItem({ user: userId, item: id }).save();
//EXTRA: push cartItem id to User cart array
await User.findOneAndUpdate({
"_id": userId
}, {
$push: {
cart: cartItem.id
}
});
return cartItem
}
我的CartItem模式如下:
User.cart