Home > Blockchain >  push multiple objects in nested array in mongoDB
push multiple objects in nested array in mongoDB

Time:05-16

I'm trying to push multiple objects in a sub array but I'm not sure if it is correct. (I assume it's incorrect cause I have an error.)

TypeError: Cannot read properties of undefined (reading 'product_identifier');

console.log(req.body.delivery[0].toDeliver.product_identifier);

it gives undefined and the http error in browser is 500.

here's my backend code.

export const delivery = async (req,res) => {

    const { id } = req.params;

    console.log(id);
    console.log(req.body.delivery[0]);

    try {
        if(!id) return res.status(404).json({ message: 'ID not found' });
        await OwnerModels.findByIdAndUpdate(id,
            {
                $push: {
                    delivery: 
                    {
                        clientname: req.body.delivery[0].clientname,
                        address: req.body.delivery[0].address,
                        email: req.body.delivery[0].email,
                        number: req.body.delivery[0].number,
                        toDeliver: [
                            {
                                product_identifier: req.body.delivery[0].toDeliver.product_identifier,
                                productname: req.body.delivery[0].toDeliver.productname,
                                price: req.body.delivery[0].toDeliver.price
                            }
                        ],
                        toDeliverPaidViaPaypal: []
                    }
                }
            },
            {
                new: true
            },(err,res)=> {
                if(err) return console.log(err);
                console.log(res);
            })
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: 'Server error' });
    }
}

here's my schema.

const OwnerSchema = mongoose.Schema({
    username: {
        require: true,
        type: String,
    },
    password: {
        require: true,
        type: String,
    },
    isAdmin: {
      type: Boolean,
      default: true,
    },
    store: [
        {
            product_identifier: {
              type: String,
              require: true,
            },
            productname: {
                type: String,
                required: true,
              },
            price: {
                type: Number,
                required: true,
              },
            quantity: {
                type: Number,
                required: true,
              },
            categoryfilter: {
              type: String,
              required: true
            },
            description: {
                type: String,
                required: true,
              },
            specs: {
              type: String,
              required: true
            },
            imageBase64: {
                type: String,
                required: true,
              },
            timestamp: {
              type: String,
              required: true,
            }
            
        }
    ],
    delivery: [
      {
        clientname: {
          type: String,
          required: true
        },
        address: {
          type: String,
          required: true
        }, 
        email: {
          type: String,
          required: true
        },
        number: {
          type: Number,
          required: true
        },
        toDeliver: [
          {
            product_identifier: {
              type: String,
              require: true,
            },
            productname: {
              type: String,
              required: true
            },
            price: {
              type: Number,
              required: true
            },
          }
        ],
        toDeliverPaidViaPaypal: [
          {
            product_identifier: {
              type: String,
              require: true,
            },
            productname: {
              type: String,
              required: true
            },
            price: {
              type: Number,
              required: true
            },
          }
        ]
      }
    ]
});

here's my Axios request.

export const delivery = (adminID,clientname,address,email,number,todeliver,viapaypal) => api.patch(`/checkout/${adminID}`, 
    {
        delivery: [
            {
                clientname: clientname,
                address: address,
                email: email,
                number: number,
                todeliver: todeliver, // array with 3 objects
                toDeliverPaidViaPaypal: viapaypal // empty array 
            }
        ]
    }
)

here's the data I'm trying to send.

{
  clientname: 'Gino Dela Vega',
  address: '008 Estrella.st Santo Cristo City of Malolos,Bulacan',
  email: '[email protected]',
  number: 9922325221,
  todeliver: [
    {
      product_identifier: 'tl9d3g1ut9pb2o13-87r0c',
      productname: 'DELL E2219HN',
      price: 7500,
      imageBase64: ........,
      quantity: '99',
      date: '1652347791630',
      _id: '627cd4d28c7976e1f02817a3'
    },
    {
      product_identifier: 'd173prauc2-t93ln1o6t58',
      productname: 'Hanns.G HL195',
      price: 4500,
      imageBase64: ........,
      quantity: '99',
      date: '1652347791630',
      _id: '627cd4d58c7976e1f02817aa'
    },
    {
      product_identifier: '87l2bu3o971tt1drcwp-3t',
      productname: 'LG E1941T',
      price: 4500,
      imageBase64: ........,
      quantity: '99',
      date: '1652347791630',
      _id: '627cd4da8c7976e1f02817b1'
    }
  ],
  toDeliverPaidViaPaypal: []

CodePudding user response:

Because your backend you call toDeliver in req.body.delivery[0].toDeliver but in axios request you send todeliver. Just change in axios request from todeliver to toDeliver Here is:

delivery: [
            {
                clientname: clientname,
                address: address,
                email: email,
                number: number,
                toDeliver: todeliver, // <============ **HERE IS**
                toDeliverPaidViaPaypal: viapaypal // empty array 
            }
        ]
  • Related