Mongoose 验证错误 路径为必填项

问题描述 投票:0回答:1

向我使用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 创建记录。

我在这里看到了其他类似的查询,但问题和解决方案似乎与我的具体情况不符。

任何帮助将不胜感激。谢谢。

mongoose mongoose-schema
1个回答
0
投票

当您在此处调用

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);
© www.soinside.com 2019 - 2024. All rights reserved.