簡體   English   中英

(已解決)如何刪除其他集合引用的文檔和子文檔 - MongoDB Mongoose

[英](Solved) How to Delete document and sub documents referenced from others collections - MongoDB Mongoose

我有這個集合Cart購物車架構)要刪除,它被其他 2 個方案引用, MealCustomer (所有者用戶,其架構是:用戶架構)。

如何通過將 HTTP 請求中的用戶 ID 作為 req.params.id 傳遞來刪除購物車?

購物車架構

const mongoose = require('mongoose');
const idValidator = require('mongoose-id-validator');

const Schema = mongoose.Schema;
 

const cartItemSchema = new Schema ({
    quantity: { type: Number, required: true },
    itemId: { type: mongoose.Types.ObjectId, required: true, ref: 'Meal' }
});

const cartSchema = new Schema ({
    cartItems : [
        cartItemSchema
    ], 
    customer: { type: mongoose.Types.ObjectId, required: true, ref: 'User'}
});


cartSchema.plugin(idValidator);
module.exports = mongoose.model('Cart', cartSchema);

我創建了一個刪除文檔的函數,但它不起作用,它返回消息:“已刪除購物車。”,但不是真的,文檔仍保留在集合中。

const deleteCartByUserId = async (req, res, next) => {
    const userId = req.params.uid;

    let cart;

    try {
        cart = await Cart.find({ customer: userId });
    } catch(err) {
        const error = new HttpError('Something went wrong, could not delete cart.', 500);
        return next(error);
    }

    if(!cart) {
        const error = new HttpError('Could not find cart for this user id.', 404);
        return next(error); 
    }

    try {
        Cart.deleteOne({ customer: userId });
    } catch(err) {
        console.log(err);
        const error = new HttpError('Something went wrong, could not delete cart.', 500);
        return next(error);
    }

    res.status(200).json({ message: 'Deleted cart.' });
};

所以問題是你在刪除一個函數調用之前錯過了等待。 此外,我還更改了一些您的代碼以使其更清晰:

const functionHandler = fn =>
    (req, res, next) =>
        Promise
            .resolve(fn(req, res, next))
            .catch(next);

const deleteCartByUserId = functionHandler(async (req, res) => {
    const { params: { uid: userId } } = req;
    const cart = await Cart.findOneAndDelete({ customer: userId })
    if(!cart) {
        throw new HttpError('Could not find cart for this user id.', 404);
    }
    res.status(200).json({ message: 'Deleted cart.' });
});

在您的錯誤處理程序中間件中,您可以檢查錯誤類型,如果不是 HttpError 則使用內部服務器錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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