向我使用express和mongoose创建的API提交post请求时收到500错误。我收到的错误是...错误是 ValidationError: userId: Path
userId
is required.
我传递的请求正文是..
{
"order": [
{
"item": {
"id": "p2",
"title": "Scarf",
"description": "Red Scarf",
"price": 8
},
"quantity": 2,
"totalItemCost": 16
}
],
"userId": "659e15b29fcef318fc03bde8"
}
我的创建订单控制器看起来像……
export const createOrderController = async (req: express.Request, res: express.Response) => {
try {
const order = req.body;
console.log('order is ' + JSON.stringify(order))
let createdOrder = await createOrder({
order
})
return res.status(200).json(createdOrder).end();
}
catch (error) {
console.log('Error is ' + error)
return res.sendStatus(500)
}
}
我的订单数据架构和模型是..
const productSchema = new mongoose.Schema({
id: { type: String, required: true },
title: { type: String, required: true },
description: { type: String, required: true },
price: { type: Number, required: true },
})
const OrderItemSchema = new mongoose.Schema({
item: { type: productSchema, required: true },
quantity: { type: Number, required: true },
totalItemCost: { type: Number, required: true }
})
const OrderSchema = new mongoose.Schema({
order: { type: [OrderItemSchema], required: true },
userId: { type: String, required: true }
})
export const OrderModel = mongoose.model('order', OrderSchema);
export const createOrder = (createdOrder: Record<string, any>) => new OrderModel(createdOrder).save().then((order) => order.toObject())
我不明白为什么它没有将元素 userId 识别为创建订单控制器中订单的 console.log 清楚地将其显示为顶级元素,因为它作为有效负载传入。
如果我将 order const 的分配更改为..
,我就可以让它工作const order = req.body.order
但是我必须使模式中的 userId 元素不再需要,并且它显然不会使用 userId 创建记录。
我在这里看到了其他类似的查询,但问题和解决方案似乎与我的具体情况不符。
任何帮助将不胜感激。谢谢。
当您在此处调用
createOrder
函数时:
let createdOrder = await createOrder({
order
})
您正在将
order
包装在一个对象中,该对象在 JavaScript 中是简写形式,翻译为:
let createdOrder = await createOrder({
order: order
})
因此
req.body
的内容被分配给文档的 order
属性,并且 userId
将成为该 order
对象的一部分。就 mongoose 而言,没有传入 userId
属性。
你想做的是这样的:
let createdOrder = await createOrder(order);