在更新查询中重用查询中的_id

时间:2018-06-16 06:58:15

标签: node.js mongodb mongoose

使用mongoose向Mongodb 3.6.4发布新订单时,我想检查

  • 如果ProductID有效
  • 如果ProductID存在订单
    • 如果订单存在,请使用OrderID更新订单
    • 如果订单不存在,请创建新订单

以下是我正在使用的代码

// POST new Order
router.post('/', (req, res, next) =>{
    let _orderID = null;
    let _orderQuantity = null;
    Product.findById(req.body.productID)
        .then(product =>{
            // if Product NOT found, then product === null, return 404
            if(!product){
                return res.status(404).json({message: "Product ID is not valid"})
            }else{
                console.log("POST new Order - Product ID is valid");
            }
        })
        .catch(e =>{
            res.status(500).json({error: e})
        });
    // Check Orders to see if there is an order with the product
    Order.findOne()
        .where({productID: req.body.productID})
        .exec()
        .then(order =>{
            console.log(order);
            if(!order){
                console.log("Create the New order");
                const finalOrder = new Order({
                    _id: mongoose.Types.ObjectId()
                    , productID: product._id
                    , quantity: req.body.quantity
                });
                res.status(201).json({
                    message: "Order created successfully"
                    , order: {
                            ...finalOrder
                    }
                    , request:{
                        type: "GET"
                        , url: config.app.baseurl + "/orders/" + result._id
                    }
                })
            }else{
                console.log("Order Exists " + order._id);
                _orderID = order._id;
                _orderQuantity = order.quantity;
            }

        })
        .catch(e => {
            res.status(500).json({error: e})
        });

// @TODO findOneAndUpdate returns 404

    Order.findOneAndUpdate({_id: _orderID}, {$set: {quantity: Number(_orderQuantity) + Number(req.body.quantity) }})
        .then(doc =>{
            if(doc){
                console.log("Updating Order");
                res.status(200).json({
                    _id: doc._id
                    , message: "Order Updated Successfully"
                    , request:{
                        description: "Show Updated Order"
                        , type: "GET"
                        , url: config.app.baseurl + "/orders/" + doc._id
                    }
                })
            }else{
                res.status(404).json({error: "Order Not found"})
            }
        })
        .catch(e=>{
            res.status(500).json({error: e})
        })

});

当我使用请求正文通过Postman提交POST请求时

{ "productID": "5b2351619dc5b22ae6f2189e" , "quantity": "10" }

我收到来自Order.findOneAndUpdate()的回复404,“订单未找到”错误,即使“productID”有效。

有任何建议如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您以异步方式编写代码,但将其用作同步方法。

执行顺序不是您的代码的顺序执行顺序,因此您可能会发现异常无处不在。

相反:

Product.findById(req.body.productID).then(product => {
  // if Product NOT found, then product === null, return 404
  if(!product){
     return res.status(404).json({ message: "Product ID is not valid" })
  } else {
    console.log("POST new Order - Product ID is valid");
    // Create or update order:
    Order.findOneAndUpdate(
      { productID: req.body.productID },
      { 
        $set: { $inc: { quantity: Number(req.body.quantity) }},
        $setOnInsert: { productId: req.body.productID, quantity: Number(req.body.quantity) }
      },
      { new: true, upsert: true }
    ).then(doc => {
      console.log(doc)
    })
  }
}).catch(e =>{
  res.status(500).json({error: e})
});