web-dev-qa-db-fra.com

Supprimer le document à l'aide de findOneAndRemove Mongoose

Je reçois cette erreur en essayant de supprimer un document de la base de données: 

Impossible d'obtenir/supprimer/532fa5e56f885c7fec5223b1fds

Comment puis-je supprimer avec succès le document?

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"
6
user2175731

Le verbe HTTP que vous utilisez n'est pas correct Use app.delete("/delete/:id", routes.delete_offer);

Je pense que cela devrait fonctionner. Parce que je ne pense pas qu’il n’y ait pas de méthode del dans le verbe HTTP pour le cadre de express.js, il s’agit principalement de GET, POST, PUT, DELETE et de quelques autres.

5
John Waweru

Notez que vous utilisez la fonction Mongoose findByIdAndRemove pour récupérer et supprimer l’objet de la 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!'});
    });
}
1
ie2020

Vous avez donc une route configurée pour unDELETEverbe dans un sens RESTful. Vous ne semblez pas l'appeler de cette façon ou l'utiliser de manière RESTful.

Votre application devrait vraiment gérer cela comme une requêteRESTE, et émettre le statut et le contenu comme réponse appropriée à ce qui s’est passé. En ce moment, vous redirigez vers une autre URL. Ce n'est pas la bonne approche. Mais si vous ne comprenez tout simplement pas REST, faites-le ainsi, mais changez votre route pour utiliserGETà la place.

Pour ce que cela vaut, une fois que vous avez déterminé votre utilisation et vos tests, utilisez éventuellement curl ou un procédé similaire à celui utilisé précédemment - indiqué . Ensuite, envisagez peut-être d’utiliser .findByIdAndRemove() à la place.

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

Et puis, en fait, vérifier la réponse correspond à ce que vous attendez avant de simplement transmettre ou envoyer une réponse valide ou une réponse erronée. Quel est ce que vous devriez faire. 

1
Neil Lunn

Si vous utilisez de la mangouste. Vous pouvez réparer le fichier 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
Duy Nguyen