findOneAndDelete Mongoose 不工作 MERN 堆栈
Posted
技术标签:
【中文标题】findOneAndDelete Mongoose 不工作 MERN 堆栈【英文标题】: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
,假设您没有更改此设置,您需要将类型为 string
的 req.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 不工作 MERN 堆栈的主要内容,如果未能解决你的问题,请参考以下文章
node - DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `us
MERN 堆栈上的 FindOneAndDelete 将返回成功但数据仍在数据库中?
findOneAndDelete() 和 findOneAndRemove() 之间的区别
弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?