使用findOneAndRemove Mongoose删除文档

7

当我尝试从数据库中删除文档时,出现了以下错误:

无法GET /delete/532fa5e56f885c7fec5223b1fds

我该如何成功删除文档?

app.js

//Delete 
app.del('/delete/:id', routes.delete_offer);

routes/index.js

    //Delete
    exports.delete_offer = function (req,res){
      Offer.findOneAndRemove({'_id' : req.params.id}, function (err,offer){
        res.redirect('/newsfeed');
      });
    };

views/dashboard.jade

        - each offer in offers
            div.offer.row
                a(href="/offer/" + offer._id)
                    div.columns
                        div.sell_type
                            p=offer.type
                    div.small-8.columns.sell_info
                        p.sell_price="$" + offer.fixedPrice() + " "
                        p.sell_location="@ " + offer.location + " ›"
                    div.small-4.columns.sell_pic
                        p=offer.user_id
                a.delete(href="/delete/" + offer._id)="Delete Offer"

4
错误信息不够吗?您的路由需要使用“DELETE”动词,而您正在尝试使用“GET”。请参考此处了解更多信息。 - Neil Lunn
确保您实际上是在发布到路由。如果您使用浏览器导航到该路由,它实际上会发出GET请求。请使用Postman验证API。 - Parikshit Hooda
4个回答

5

您使用的HTTP动词不正确,请使用app.delete("/delete/:id", routes.delete_offer);

我认为这应该可以解决问题。因为我认为express.js框架中没有del方法的HTTP动词,它主要是GET,POST,PUT,DELETE以及其他一些。


1
无法获取/delete/532fa5e56f885c7fec5223b1fds。在调用时,您还必须使用DELETE而不是GET。 - ki9

3
如果您在使用mongoose,您可以修复文件routes/index.js。
//Delete
exports.delete_offer = function (req,res){
  Offer.findOneAndRemove({_id : new mongoose.mongo.ObjectID(req.params.id)}, function (err,offer){
    res.redirect('/newsfeed');
  });
};

1

所以你已经设置了一个 DELETE 动词的路由,符合 RESTful 的方式。但是你似乎没有按照这种方式调用它或使用它。

你的应用程序应该以 REST 请求的方式处理它,并根据情况发出状态和内容作为响应。现在你正在重定向到另一个URL,这不是正确的方法。但如果你真的不理解 REST,那么可以这样做,但请将你的 路由 改为使用 GET

值得注意的是,一旦你解决了使用和测试问题,可以考虑改用 .findByIdAndRemove(),并可能使用 curl 或类似工具进行测试,如上文所

Offer.findByIdAndRemove(req.params.id, function (err,offer){
    if(err) { throw err; }
    // ...
}

在转发或发送有效或错误响应之前,实际检查响应是否符合您的预期是必要的。这就是您应该做的。


1

如果您使用Mongoose的findByIdAndRemove函数从Model中检索并删除对象,请注意。

exports.delete_offer = function(req, res) {

    Offer.findByIdAndRemove(req.params.id, function(err) {
        if (err)
            res.send(err);
        else
            res.json({ message: 'Offer Deleted!'});
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接