使用mongoose向Mongodb 3.6.4发布新订单时,我想检查
以下是我正在使用的代码
// 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”有效。
有任何建议如何解决这个问题?
答案 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})
});