【问题标题】:Delete document using findOneAndRemove Mongoose使用 findOneAndRemove Mongoose 删除文档
【发布时间】:2014-05-01 08:02:49
【问题描述】:

我在尝试从数据库中删除文档时收到此错误:

无法获取 /delete/532fa5e56f885c7fec5223b1fds

如何才能成功删除文档?

app.js

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

路由/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"

【问题讨论】:

  • 错误信息还不够吗?您的路线需要一个 DELETE 动词。您正在尝试使用 GET。请参阅here 了解一下。
  • 确保您实际发布到该路线。如果您使用浏览器导航到该路线,它实际上会发出一个获取请求。使用 postman 验证 api。

标签: node.js mongodb mongoose pug node.js-connect


【解决方案1】:

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

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

【讨论】:

  • Cannot GET /delete/532fa5e56f885c7fec5223b1fds 无论您从哪里调用它,都必须使用 DELETE 而不是 GET。
【解决方案2】:

如果您使用猫鼬。您可以修复文件 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');
  });
};

【讨论】:

    【解决方案3】:

    因此,您为 DELETE 动词设置了 RESTful 意义上的路由。您似乎没有以这种方式调用它或以 RESTful 方式使用它。

    您的应用程序应该真的将其作为 REST 请求进行处理,并将状态和内容作为与所发生事件相适应的响应返回。现在您正在重定向到另一个 URL。这不是正确的做法。但是,如果您只是不了解 REST,那么就这样做,但将您的 route 更改为使用 GET

    对于它的价值,一旦你整理了你的使用和测试,可能使用 curl 或类似shown。那么或许可以考虑改用.findByIdAndRemove()

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

    然后在转发或发送有效或错误响应之前实际检查响应是您所期望的。这是你应该做的。

    【讨论】:

      【解决方案4】:

      注意是否使用 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!'});
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 2020-07-29
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 2019-01-04
        • 2017-12-24
        相关资源
        最近更新 更多