【问题标题】:findOneAndDelete Mongoose not working MERN stackfindOneAndDelete Mongoose 不工作 MER​​N 堆栈
【发布时间】: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);
  }}>

谢谢,祝你今天愉快

【问题讨论】:

    标签: node.js reactjs mongodb express react-redux


    【解决方案1】:

    你的代码有两个问题:

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

    2. _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);
    猜你喜欢
    • 2012-01-03
    • 2021-05-16
    • 1970-01-01
    • 2013-02-16
    • 2014-07-13
    • 1970-01-01
    • 2011-06-13
    • 2018-02-25
    • 2014-08-16
    相关资源
    最近更新 更多