开发者问题收集

为什么它没有从 mongoDB 中删除数据但仍然显示成功消息

2021-01-24
1096

点击事件

这是下面 HTML 按钮的点击事件处理程序

const deleteProduct = (productsId) =>{
        axios.delete(`/api/product/`,{
            params: {productsId}
        })
        .then(response =>{
            setSuccessMessage("Item Deleted Successfully", response, products)
        })
        .catch(error =>{
            setErrorMessage("Item Deleting Failed")
        })
    }

HTML

上面的点击事件是针对删除按钮的

<div className="row justify-content-center">
                {products && products.map(p => (
                    <Card style={{ width: '18rem', margin: '50px 50px'}} key={p._id} value={p._id}>
                    <Card.Img variant="top" src={p.imageLink} style={{width:'auto', height:'180px', objectFit:'cover'}}/>
                    <Card.Body >
                        <Card.Title>Name : {p.productName}</Card.Title>
                        <Card.Text>Description : {p.productDesc}</Card.Text>
                        <Card.Text>Price : ${p.productPrice}</Card.Text>
                        <div className="d-flex justify-content-center">
                        <Button className="mr-2" target="_blank"><FaPen /> Edit </Button>
                        <Button target="_blank" onClick={() => deleteProduct(p._id)}><FaTrash /> Delete </Button>
                        </div>
                    </Card.Body>
                    </Card>
                ))}
        </div>

控制器

这是服务器端的删除控制器

exports.deleteAll = (req, res) => {
const { id } = req.query;
 Product.findByIdAndDelete(id , (error, data)=>{
     if(error) {
         console.log('error in deleting')
         throw error;
     }
     else{
         console.log('user has been deleted', data);
         res.status(204).json(data)
     }
 })

>

路由

删除路由器

router.delete('/',authenticateJWT, productController.deleteAll)

显示 DELETE /api/product/?productsId=600c1e6a48d6c4422c095f03 204 4.412 ms - -

但数据未被删除

2个回答

有时,当 mongoose 找不到元素时,它仍会以 200 响应。尝试访问此网站: https://mongoplayground.net/ 来测试您的代码。

在为 mongoose 编写查询之前,请务必 console.log() 您的 req.body 以确保您的值已发送到服务器。

const deleteProduct = (productsId) =>{
        axios.post(`/api/product/`,{
            productsId
        })
        .then(response =>{
            setSuccessMessage("Item Deleted Successfully")
        })
        .catch(error =>{
            setErrorMessage(error.response.data.msg)
        })
    }
exports.deleteAll = (req, res) => {
const { productsId } = req.body;
console.log(productsId, req.body); //console log your value to make sure
 Product.update({"id": productsId},{$pull: {"id": productsId}}).then(() => {
 res.status(200).json({msg: "Deleted"})
 
 }).catch((err) => {res.status(400).json({msg: "failed"})})
twominds
2021-01-24

正如@user67所提到的,mongoose的findByIdAndUpdate在告知它是否找到了任何文档并成功删除它,或者它是否没有找到任何文档,因此甚至没有尝试删除任何内容时,并不是很雄辩。 根据 mongoose的文档 ,findByIdAndDelete():

Finds a matching document, removes it, passing the found document (if any) to the callback.

这意味着首先检查文档是否已被找到是微不足道的。只需在返回成功响应之前添加额外的检查:

Product.findByIdAndDelete(id , (error, data)=>{
 if(error) {
     console.log('error in deleting')
     throw error;
 }
 if (!data) {
     return res.status(404).send({ error: 'Data not found' });
 }

 console.log('user has been deleted', data);
 return res.status(204).json(data);})

这额外的三行代码看起来有点乏味,但在使用这种系统一段时间后,我已经习惯添加它们,因为它们为我节省了很多时间和麻烦。

amda
2021-01-24