如何在 mongoose Schema 中创建数组以及如何通过 json 向其发送数据

How to create an array in mongoose Schema and how to send data to it through json

我正在创建一个电子商务项目,但在创建订单模式时遇到了两难。根据我的说法,我确信客户有时不能订购一件商品,因此订单应该排成一列,但由于我是初学者,所以我在浏览时遇到了麻烦。这是我在我的模型和控制器中想出的,但是每当我 post 数据时,我收到的 res.json 带有一个空对象。

我希望有人能帮助解决这个问题。

我的订单模型

import mongoose from 'mongoose'

const ordersSchema = new mongoose.Schema({

    user:{
        type:mongoose.Schema.Types.ObjectId,
        required:true,
        ref:"users",
    },
    orders:[
        {
            item:{
                type:mongoose.Schema.Types.ObjectId,
                required:true,
                ref:'products'
        
            },
            quatity:{
                type:Number,
                required:true,
                default:1
        
            },
            price:{
                type:Number,
                required:true,
        
            }

        }

    ]   
});

export const ordersModel = mongoose.model("orders", ordersSchema);

我创建订单的控制器代码

import { ordersModel} from "../models/orders.model.js"
import asyncHandler from 'express-async-handler'


export const makeOrder =asyncHandler(async(req, res) => {
    const {item, price, quantity, payment} = req.body;
    
    if(!item || !price ){
        res.sendStatus(401)
        res.json({message: 'There is no order to make'});
    }else{
          
          const order = new ordersModel(
            {
                user:req.user._id,
                order:[
                    {
                        item,
                        price,
                        quantity,
                        payment
                    }
                ],
            }
          );

          const made_order = await (order.save());

          if(made_order){
              return res.json({
                orderId:made_order._id,
                customer:made_order.user._id,
                order:{
                        item:made_order.item,
                        price:made_order.price,
                        quantity:made_order.quantity,
                        payment:made_order.payment,
                    }
                
              })
          }
    }
    
});

我在创建新订单时发现有错字。您在架构中有 orders 字段,但在创建新订单时传递的是 order 而末尾没有 s。下面是正确的实现

const order = new ordersModel(
  {
      user: req.user._id,
      orders: [
          {
              item,
              price,
              quantity,
              payment
          }
      ],
  }
);


您在架构中也没有 payment 字段,但您在创建订单时传递了它。所以如果你想包含付款字段,你的架构应该是这样的

const ordersSchema = new mongoose.Schema({

    user:{
        type:mongoose.Schema.Types.ObjectId,
        required:true,
        ref:"users",
    },
    orders:[
        {
            item:{
                type:mongoose.Schema.Types.ObjectId,
                required:true,
                ref:'products'
        
            },
            quatity:{
                type:Number,
                required:true,
                default:1
        
            },
            price:{
                type:Number,
                required:true,
            },
            payment:{
                type:Number,
                required:true,
            }

        }

    ]   
});

最后你可以去掉if语句,像这样发送一个res

const made_order = await order.save();

return res.json({
      orderId:made_order._id,
      customer:made_order.user,
      orders: made_order.orders
    })

如果您想在一次调用中创建多个订单,您的 makeOrder 控制器应该像这样

export const makeOrder = asyncHandler(async(req, res) => {
    
    if(!Array.isArray(req.body) || !req.body.length) {
        res.sendStatus(401)
        res.json({message: 'There is no order to make'});
    } else {
      const order = new ordersModel(
        {
            user: req.user._id,
            orders: req.body,
        }
      );

      const made_order = await order.save();

      return res.json({
            orderId: made_order._id,
            customer: made_order.user,
            orders: made_order.orders
          })
     }
});

然后您可以拨打 API 电话并发送多个订单作为请求正文

 [ 
   { 
     "item":"61f58bb0d70ae52c6e470fb7", 
     "price":4500, 
     "quantity":2,
     "payment": 9000
   }, 
   { 
     "item":"61f58bb0d70ae52c6e470fb7", 
     "price":4500, 
     "quantity":2,
     "payment": 9000
   } 
 ]