[英]Chaining promisses. How I can use catch to return error?
我是 Node 新手,我正在嘗試使用僅存在該產品的產品創建訂單。 我正在使用 mongoose + 快遞。
在我看來,它應該像:請求創建訂單(包含產品和數量)-> 檢查數據庫是否存在產品-> 創建訂單-> 插入數據庫-> 響應。
我希望我的代碼能夠像
Product.find(productId).then(如果存在創建訂單 + insertdb).then(接收插入 -> 創建響應).catch(如果錯誤響應錯誤)。
這是我現在的代碼:
router.post("/", (req, res, next) => {
Product.findById(req.body.productId)
.then((product) => {
if (!product) {
res.status(404).json({ error: "Product not found" });
return;
}
console.log("Product:" + product);
const order = new Order({
_id: new mongoose.Types.ObjectId(),
product: req.body.productId,
quantity: req.body.quantity,
});
return order.save();
})
.then((doc) => {
console.log(doc);
if (!doc) {
return;
}
res.status(201).json({
message: "Order created",
createdOrder: {
_id: doc._id,
product: doc.product,
quantity: doc.quantity,
request: {
type: "GET",
url: "http://localhost:3000/orders/" + doc._id,
},
},
});
})
.catch((err) => {
console.log(err);
res.status(500).json({ error: err });
});
});
但是,我在返回之前檢查我的第二個.then()
上是否存在 doc。 是否有推薦的方法來防止在if(!product)
塊中執行我的鏈?
我試過了:
throw new Error(404);
而不是return
,但由於 catch 塊中的 res.status(500) ,我得到“無法在將標頭發送到客戶端后設置標頭”。return res.status(404).json({ error: "Product not found" });
但與1相同的錯誤。 使用async/await
可能更具可讀性。 您不需要進行額外的數據庫調用來獲取保存的訂單,因為它是由.save
返回的
router.post("/", async (req, res, next) => {
try {
let product = await Product.findById(req.body.productId);
if (!product) {
res.status(404).json({
error: "Product not found"
});
} else {
const order = new Order({
_id: new mongoose.Types.ObjectId(),
product: req.body.productId,
quantity: req.body.quantity,
});
let orderReturned = await order.save();
res.status(201).json({
message: "Order created",
orderReturned
}
}
catch (err) {
res.status(500).json({
error: err
});
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.