首页 > 解决方案 > 在 NodeJS 中使用 Mongoose 保存具有新创建的引用 ID 的新对象

问题描述

我有一个名为order的模型,它有一个属性orderItem。orderItem 的类型为 id orderItem 这里是模式的摘录。

const mongoose = require('mongoose');

const orderSchema = mongoose.Schema({
    orderItems: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'OrderItem',
        required: true
    }],
    shippingAddress1: {
        type: String,
        required: true,
    },

我首先创建订单项目,然后将订单项目集合保存为我要保存的新订单的一部分。这样做:

const orderItemsIds = Promise.all(req.body.orderItems.map(async orderItem => {
        let newOrderItem = new OrderItem({
            quantity: orderItem.quantity,
            product: orderItem.product
        })

        newOrderItem = await newOrderItem.save();

        return newOrderItem._id;
    }))

    try {
            
        const resolvedOrderItemsIds = await orderItemsIds;

        console.log(resolvedOrderItemsIds);

        let order = new Order({
            orderItems: resolvedOrderItemsIds,
            ...
        })

        // order = await order.save();
        order.save(function (err) {
            if(!order) {
                return res.status(400).send('The order cannot be created!');
            }
    
            return res.status(201).send({'message': 'Order Created', order});
        })
    

    } catch (error) {
        
    }

})

OrderItems 和Order已创建,我在 PostMan 中收到所有内容均已创建的响应。我看到这样的结果:

{
    "message": "Order Created",
    "order": {
        "orderItems": [
            "615562ab6c7cd7021c7e37f7",
            "615562ab6c7cd7021c7e37f8"
        ],
        "shippingAddress1": "21 sample street",
        "shippingAddress2": "Sample Bus Stop",
        "city": "Sample",
        "zip": "100001",
        "country": "Sample",
        "status": "Pending",
        "user": "6151a6d7f6d3b96060f0aec5",
        "_id": "615562ab6c7cd7021c7e37fb",
        "dateOrdered": "2021-09-30T07:09:31.493Z",
        "id": "615562ab6c7cd7021c7e37fb"
    }
}

有趣的是,订单没有保存在 MongoDB 中。我能知道我做错了什么吗?

标签: javascriptnode.jsmongodbmongoosewebapi

解决方案


原来我在构建请求正文时缺少一个必填字段,并且在以我的方式发布请求后没有任何形式的信息。当我像这样保存项目时,我发现了我缺少的字段:

await order.save().then(item => {
            return res.status(201).send({'message': 'Order Created', item});
        }).catch(err => {
            res.status(400).send({"message": 'The order cannot be created!', "error": err});
        })

推荐阅读