findOneAndDelete Mongoose 不工作 MER​​N 堆栈

Posted

技术标签:

【中文标题】findOneAndDelete Mongoose 不工作 MER​​N 堆栈【英文标题】:findOneAndDelete Mongoose not working MERN stack 【发布时间】:2021-01-09 17:26:10 【问题描述】:

GoodDay 专家,

我尝试了以下代码,但它没有工作,它给了我空值..也许我的路线是错误的,但基本上它在其他路线上的工作方式......这是我删除案例的后端:管理.js/动作

export const removeRecipient = (payload) => async (dispatch) => 
  try 
    const res = await axios.delete(
      `$_config.MAT_URL/api/1/customer/delete`,
      payload
    );
    dispatch(
      type: DELETE_CUSTOMER,
      payload: res.data,
    );
   catch (err) 
    dispatch(
      type: POST_ERROR,
      payload:  err ,
    );
  
;

对于我的路线,这是在 customer.js 下对 findOneAndDelete 的猫鼬查询:

   router.delete("/delete", (req, res) => 
  Customer.findOneAndDelete( _id: req.params.id , (err, Customer) => 
    if (!err) 
      res.json( msg: "customer deleted", deleted: Customer );
     else 
      console.log("Error removing :" + err);
    
  );
);

对于前端即时通讯使用“AiOutlineDelete”,其编码为:

  const handleDelete = (id) => 
    console.log('delete')
    removeRecipient(id)
  

<a
  id=`delete-$rowIndex`
  className="anchor-action-delete"
  href="#foo"
  onClick=(e) => 
    e.preventDefault();
    handleDelete(row);
  >

谢谢,祝你今天愉快

【问题讨论】:

【参考方案1】:

你的代码有两个问题:

    req.params.id 用于/delete/:id 形式的网址,这显然不是您的路线,您应该将其更改为req.query.id,而不是匹配网址中的查询参数,例如/delete?id=123

    _id 的默认类型是 ObjectId,假设您没有更改此设置,您需要将类型为 stringreq.query.id 转换为 ObjectId

看起来你正在使用 mongoose,所以这里是 mongoose 语法:

const mongoose = require("mongoose");

router.delete("/delete", (req, res) => 
    Customer.findOneAndDelete( _id: new mongoose.Types.ObjectId(req.query.id) , (err, Customer) => 
        if (!err) 
            res.json( msg: "customer deleted", deleted: Customer );
         else 
            console.log("Error removing :" + err);
        
    );
);

对于nodejs原生Mongo包:

import ObjectId from "mongodb";
...

new ObjectId(req.query.id)

【讨论】:

感谢您的参考...我在 post man 和 redux 开发工具上试了一下。DELETE_CUSTOMER reducer 下的输出:msg(pin):"customer deleted" deleted(pin):null跨度> 你是如何发送 id 的?使用查询参数?如果是这样,请改用req.query.id 当我发送查询时。例如像 update router.post('/updateById')... findOneAndUpdate _id $set: name,email,organisation 之类的 您是否将代码更改为 req.query.id 而不是 req.params.id?,我在回答中添加了简要说明。 同样的输出......日志上显示该值没有得到“_id(ObjectID)”......仍然为空......【参考方案2】:

我没有看到您将 id 发送到后端,但您正在尝试从 req.params.id 中检索它尝试在链接末尾传递 id,例如“delete/:id”,并在路由中指定它.

如果不能解决,请尝试下面的路由代码

如果没有任何效果,请检查这一点,在组件中您需要发送 id(对象 id),但我看到“行”行的值是什么?如果行值不是数据库中的 id,则不会删除。如果这是您的问题,请尝试通过保留断点来检查代码或编写 console.log() 来检查 "row" 的值。

    try 
        const removedProject = await Customer.remove(
            _id: req.params.id
        )
        res.json(removedProject)
     catch (err) 
        res.json(
            message: err
        )
    

【讨论】:

DepricationWarning 出现... Collection.remove 已弃用。而是使用 deleteOne、deleteMany、ir bulkWrite 我试过 deleteOne 和控制台的输出:n: 0, ok: 1, deletedCount: 0 deletedCount: 0 n: 0 ok: 1 router.delete("/delete", async (req, res) => try const removedCustomer = await Customer.deleteOne( _id: req.params.id ) res.json( removedCustomer) catch (err) res.json( message: err ) ); 好兆头,你必须看到一些响应 n:0, ok:1..... 现在让我们检查 id 的值 一次通过在等待语句之后写入控制台日志来检查 req.params.id 值,例如 const removedProject = await Customer.deleteOne( _id: req.params.id ) console.log("id" , req.params.id);

以上是关于findOneAndDelete Mongoose 不工作 MER​​N 堆栈的主要内容,如果未能解决你的问题,请参考以下文章

node - DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `us

MERN 堆栈上的 FindOneAndDelete 将返回成功但数据仍在数据库中?

findOneAndDelete() 和 findOneAndRemove() 之间的区别

弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?

MongoDB 弃用警告

DiscordJS 编辑现有嵌入