我正在使用NodeJS、express和MongoDB构建一个电子商务Web应用程序,我正在开发一个API,用于将产品ID和数量存储在一个数组中,该数组是用户的购物车。
以下是用户模型:
const userSchema = mongoose.Schema({
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
username: {
type: String,
required: true
},
access_level: {
type: Number,
default: 1
},
cart: {
type: [cartProductSchema],
default: []
}
})
这是cartProductSchema的模型:
const cartProductSchema = new mongoose.Schema({
product_id: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Product'
},
quantity: {
type: Number,
required: true,
validate: { validator: Number.isInteger }
}
}, { _id: false })
这是产品的型号:
const productSchema = new mongoose.Schema({
name: {
type: String,
required: true,
},
description: {
type: String,
required: true,
},
price: {
type: Number,
required: true,
},
stock: {
type: Number,
required: true,
validate: { validator: Number.isInteger }
}
}, {timestamps: true})
以下是发生错误的路由器的代码段:
// Add product to user's cart
const product = await Product.findOne({_id: req.body.product_id})
if (!product) {
return res.status(http.statusNotFound).json({
errors: [{ msg: "Invalid product id" }]
})
}
let cart = user.cart.slice()
cart.push({ product_id: product._id, quantity: req.body.quantity })
user.cart = cart // this is the line that causes the error
await user.save()
res.json({ msg: "Product added to cart" })
当我尝试将一个包含product_id
和quantity
的JSON对象推送到用户购物车时,我遇到了一个错误。JSON对象中有一个循环引用导致了这个错误,但我不知道我做错了什么。错误堆栈跟踪没有真正
TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property '__parentArray' -> object with constructor 'Array'
--- index 0 closes the circle
at stringify (<anonymous>)
如果我取消user.cart = cart
行的注解,我就不会得到这个错误。当我尝试更新购物车字段时,我得到这个错误。我尝试用不同的格式更新购物车字段,但都失败了。
我尝试直接推到购物车字段,但我得到相同的错误:user.cart.push({ product_id: product._id, quantity: req.body.quantity})
我还尝试用MongoDB查询直接更新购物车,但仍然得到相同的错误:
await User.updateOne(
{_id: user._id},
{ $push: { cart: { product_id: product._id, quantity: req.body.quantity } }}
)
1条答案
按热度按时间3htmauhk1#
我知道问题出在哪里了。抱歉给你添麻烦了。我应该告诉你我是用jest测试来测试API的。结果发现测试中出现了一个错误,我在npm测试脚本中添加了一个
--detectOpenHandles
标记之后就可以调试这个错误了。