J'ai essayé de créer ma première application CRUD solo (sans suivre de tutoriel) et je suis tombé sur quelque chose d'un peu bizarre que je ne peux pas comprendre. Excusez-moi si c'est assez évident, mais je n'ai rien trouvé ici à ce sujet.

J'ai ajouté ma route de suppression pour l'un de mes modèles et utilisé le code suivant :

// delete list
router.delete("/lists/:id", function(req, res){
    // find list by ID and remove it
    List.findOneAndRemove(req.params.id, function(err, deletedList){
        if(err) {
            console.log("ERROR DELETING LIST");
            console.log(err);
            res.redirect("/lists");
        } else {
            // if list is removed successfully, remove each item
            console.log(deletedList);
            Item.remove({_id: {$in: deletedList.items}}, function(err, deletedItems){
                if(err) {
                    console.log("ERROR DELETING ITEMS");
                    console.log(err);
                } else {
                    console.log("SUCCESSFULLY DELETED LIST & ALL ITEMS");
                    res.redirect("/lists");
                }
            });
        }
    });
});

Maintenant, il supprime des éléments de la base de données, mais il ne supprime pas le bon élément. J'ai un bouton sur ma page Web qui soumet un formulaire. L'action du formulaire est générée en fonction du contenu de la page où j'insère l'ID du modèle dans l'action à l'aide d'EJS. Lorsque je soumets le formulaire pour supprimer le modèle et ses éléments référencés, il finit par supprimer le premier document de la base de données, même si (à ma connaissance), j'ai spécifié que seuls les documents qui correspondent à l'ID fourni doivent être supprimés.

Je l'ai corrigé en remplaçant

List.findOneAndRemove(req.params.id, function(err, deletedList){
            if(err) {
                console.log("ERROR DELETING LIST");
                console.log(err);
                res.redirect("/lists");
            } else {

Avec

List.findOneAndRemove({_id: {$in: req.params.id}}, function(err, deletedList){
        if(err) {
            console.log("ERROR DELETING LIST");
            console.log(err);
            res.redirect("/lists");
        } else {

Bien que je ne sois pas tout à fait sûr de savoir pourquoi cela fonctionne et pas req.params.id. J'espérais juste des éclaircissements au cas où je tomberais sur quelque chose de similaire à l'avenir.

0
A_Shreddie 18 mars 2019 à 12:55

2 réponses

Meilleure réponse

Voici une raison possible que je peux signaler. Lorsque vous transmettez req.params.id à findOneAndRemove, étant donné que JS n'est pas un langage fortement typé et que vous ne le tapez pas spécifiquement, Mongoose ne sait pas quoi supprimer .

Le premier paramètre de findOneAndRemove est l'objet filter et Mongoose n'est pas en mesure de trouver le bon filtrage car le type de données qui est passé ici est une chaîne.

Je pense alors que Mongoose considère un filtre vide et comme d'habitude, un filtre vide supprime le premier élément. Un essai que vous pouvez faire est de taper explicitement le _id, disons comme

var id = new mongoose.mongo.ObjectID(req.params.id)

Et transmettez cet identifiant à la fonction findOneAndRemove().

J'espère que cela t'aides.

0
Bharath 18 mars 2019 à 10:41

Je pense qu'il supprime le premier élément de votre tableau car vous utilisez "FindOneAndRemove" - ​​comme le suggère le nom, cela limitera la correspondance à un seul document. Et dans ta première version du code :

List.findOneAndRemove(req.params.id, function(err, deletedList){

Vous ne spécifiez pas votre champ _id, donc je pense qu'il correspond à tout et ne supprime qu'un seul document en raison de la méthode que vous utilisez. Où comme dans le second, tu es

List.findOneAndRemove({_id: {$in: req.params.id}}, function(err, deletedList){
1
pieperu 18 mars 2019 à 10:02