如何让 Express 返回我刚刚在 MongoDB 中删除的对象

Posted

技术标签:

【中文标题】如何让 Express 返回我刚刚在 MongoDB 中删除的对象【英文标题】:How to get Express to return the object I just deleted in MongoDB 【发布时间】:2016-03-08 07:36:51 【问题描述】:

如果这不是一种常见的做法,请随时告诉我 - 我是一个相当新的程序员 - 但我想我过去曾见过 API,当您向资源提交 DELETE 请求时 (/ todo/1234),某些服务器将在响应中返回您刚刚删除的对象。那是一回事吗?如果是这样,我有兴趣学习如何做到这一点。这是我所拥有的:

.delete(function (req, res) 
    Todo.findById(req.params.todoId).remove(function (err) 
        if (err) res.status(500).send(err);
        res.send("Todo item successfully deleted");
    );
);

此代码确实删除了该项目,但我想返回在响应中删除的项目而不是字符串消息。如果这是正常/可以做的事情。如果由于某种原因不正常或正常,请告诉我原因,我会继续前进。或者也许有更常见的方法。

这是我在 [RFC 7231 文档][1] 中找到的:

如果成功应用了 DELETE 方法,源服务器应该 如果操作可能成功,则发送 202(已接受)状态代码 但尚未制定,204(无内容)状态代码,如果 已采取行动,无需提供进一步的信息, 或 200 (OK) 状态码(如果已执行该操作且 响应消息包括描述状态的表示。

我很难解释 200 响应的含义 - 发送字符串消息 (Success!) 还是包含消息属性 (message: "Success!") 的对象是否符合规定?或者你可以在那里做任何你想做的事吗? Express 中使用 Mongoose 的最佳做法是什么?

在此先感谢您的帮助,并为我对 HTTP 的内容感到抱歉。 [1]:https://www.rfc-editor.org/rfc/rfc7231#section-4.3.5

【问题讨论】:

【参考方案1】:

你应该使用findOneAndRemove!比如:

Todo.findOneAndremove( id: req.params.todoId , function( error, doc, result) 
    // it will be already removed, but doc is what you need:
    if (err) res.status(500).send(err);

    res.send(doc.id);
);

【讨论】:

我不确定使用findOneAndRemove()findByIdAndRemove() 因为this SO post 以及许多人对这些方法的看法。请参阅第二个答案的 cmets。一个人说“正如其他 cmets 对其他答案所指出的那样,这绕过了在架构上定义的中间件,并且可能非常危险。因此,只有在您了解将会产生的影响时才使用它。有关更多信息,请参阅 mongoosejs.com /docs/middleware.html”。这是我需要担心的事情吗? 通常仅当您在架构上使用挂钩来执行删除操作时。 但是,如果我通常可以安全地使用它们,这完美地回答了我的问题,假设我没有在我的架构中定义任何前/后挂钩。我会玩弄它,看看效果如何。 一切都取决于你的逻辑。如果你有中间件 - 那么是的:) 如果你没有任何类型的钩子 - 没有。您可以简单地将其重写为对findById 的一个查询,然后第二个(在第一个回调中)将其删除。没有“保存”选项 - 这取决于您的代码和逻辑。 啊,按照我在 OP 中的方式进行操作是否同样“危险”,我的 .remove() 不在回调中,而是链接到 @987654328 @ 方法?这是否也绕过模式删除的任何钩子?如果我确实有要在删除时执行的钩子,我想我仍然对完成删除的最佳方法感到困惑......

以上是关于如何让 Express 返回我刚刚在 MongoDB 中删除的对象的主要内容,如果未能解决你的问题,请参考以下文章

node+koa2+mongod构建项目及与express对比

如何让服务器将远程 json 对象返回给客户端?反应/快递/web3

使用 Node.js、Handlebars 和 Express 进行模板继承

如何连接到 SQL Server 2008 Express 的本地实例

如何让 Express 输出格式良好的 HTML?

如何使用 mocha 测试我的 express 应用程序?