簡體   English   中英

鏈接承諾。 如何使用 catch 返回錯誤?

[英]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)塊中執行我的鏈?

我試過了:

  1. 使用throw new Error(404); 而不是return ,但由於 catch 塊中的 res.status(500) ,我得到“無法在將標頭發送到客戶端后設置標頭”。
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM