Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js从关联元素中删除元素_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript Node.js从关联元素中删除元素

Javascript Node.js从关联元素中删除元素,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我添加了一个功能,用户可以将食谱固定到他们的个人资料中。但是,删除配方时,配方不会从用户的pinnedRecipes中删除,即使它没有出现在用户的显示页面上(ID保留在数据库中用户的pinnedRecipes中) 以下是配方和用户的羽状分类之间的关联: var userSchema = new mongoose.Schema({ username: String, password: String, admin: {type:Boolean, default: false

我添加了一个功能,用户可以将食谱固定到他们的个人资料中。但是,删除配方时,配方不会从用户的pinnedRecipes中删除,即使它没有出现在用户的显示页面上(ID保留在数据库中用户的pinnedRecipes中)

以下是配方和用户的羽状分类之间的关联:

var userSchema = new mongoose.Schema({
    username: String,
    password: String,
    admin: {type:Boolean, default: false},
    bio: {type:String, default: "Cet utilisateur n'a pas encore rempli cette section."},
    profileImage: {type:String, default: "http://www.wilwia.com/images/default-user.png"},
    pinnedRecipes:[
        {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Recipe"
        }
    ]
});

var recipeSchema = new mongoose.Schema({
    title: String,
    source: String,
    image: String,
    preplength: String,
    cooklength: String,
    portions: Number,
    description: String,
    ingredients: String,
    instructions: String,
    createdAt: { type: Date, default: Date.now },
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "User"
        },
        username: String,
    },
    comments: [
            {
                type: mongoose.Schema.Types.ObjectId,
                ref: "Comment"
            }
        ],
    category: {type:String, enum: ['appetizer', 'salad', 'soup', 'meat', 'pasta', 'breakfast', 'dessert']}
});
    //DESTROY ROUTE
router.delete("/:id", middleware.checkRecipeOwnership, function(req, res){
    Recipe.findById(req.params.id, function(err, foundRecipe){
        if(err){
            res.redirect("back");
        } else {
            //delete associated comments
            if(foundRecipe.comments.length > 0){
                Comment.remove({
                _id: {
                    $in: foundRecipe.comments
                }
            }, function(err){
                if(err){
                    console.log(err);
                }
            });
            //delete from every user's pinned recipes
            User.find({pinnedRecipes: "ObjectId(" + foundRecipe._id + ")"}, function(err, foundUsers){
                if(err){
                    console.log(err);
                } else {
                    console.log(foundUsers);
                    foundUsers.forEach(function(user){
                        user.pinnedRecipes.remove(foundRecipe);
                        user.save();
                    });
                }
            });
            //remove the campground
            foundRecipe.remove(function(err, recipe){
               if(err){
                   console.log(err);
                   res.redirect("/recipes");
               } else {
                   res.redirect("/recipes");
               }
            });
            }
        }
    });
});
以下是我尝试过的,但没有成功(除了从pinnedRecipes中删除配方外,一切都有效):

此外,以下是如何固定食谱:

// PIN ROUTE
router.get("/pin/:id", middleware.isLoggedIn, function(req, res){
    Recipe.findById(req.params.id, function(err, foundRecipe){
        if(err){
            req.flash("error", "Une erreur s'est produite.");
            res.redirect("/recipes/" + foundRecipe._id);
        } else {
            User.findById(req.user._id, function(err, user){
                if(err){
                    req.flash("error", "Une erreur s'est produite.");
                    res.redirect("/recipes/" + foundRecipe._id);
                } else { 
                  user.pinnedRecipes.push(foundRecipe);
                  user.save();
                  res.redirect("/recipes/" + foundRecipe._id);
                  req.flash("success", "Pinned recipe"); 
                }
            });
        }
    });
});

// UNPIN ROUTE
router.delete("/pin/:id", middleware.isLoggedIn, function(req, res){
    Recipe.findById(req.params.id, function(err, foundRecipe){
        if(err){
            req.flash("error", "Une erreur s'est produite.");
            res.redirect("/recipes/" + foundRecipe._id);
        } else {
            User.findById(req.user._id, function(err, user){
                if(err){
                    req.flash("error", "Une erreur s'est produite.");
                    res.redirect("/recipes/" + foundRecipe._id);
                } else { 
                  user.pinnedRecipes.remove(foundRecipe);
                  user.save();
                  res.redirect("/recipes/" + foundRecipe._id);
                  req.flash("success", "Pinned recipe"); 
                }
            });
        }
    });
});

非常感谢

我发现您的代码存在两个问题:

  • 您正在执行2个异步操作,而没有真正等待它们的响应。始终确保它们全部完成。因此,执行一个并等待其回调执行,然后执行另一个并等待其回调执行,然后执行下一个,以此类推

  • 更重要的是:我不相信
    user.pinnedRecipes.remove(foundRecipe)
    会删除引用。您需要删除它[滚动到删除子文档部分]

然而,您似乎试图对MongoDB执行一个但是。实现这一点的一种方法是使用。请注意文档中的注释,只有在执行
myDoc.remove()
时才会调用它,而不是在调用
MyModel.remove()

我相信这将简化您的代码:

RecipeSchema.pre('remove', function (next) {
    var recipe = this;
    // remove recipe comments
    Comment.remove({ _id: { $in: recipe.comments }}, function (err) {
        if (err) {
            return next(err);
        }
        // THEN remove users' recipe references
        User.update({ pinnedRecipes: { $in: [recipe._id] }}, { $pull: recipe._id }, { multi: true }, function (err) {
            if (err) {
                return next(err);
            }
            next();
        });
    });
});



router.delete("/:id", middleware.checkRecipeOwnership, function (req, res) {
    // notice we didn't do Recipe.remove(req.params.id, cb) 
    // b/c Recipe is the model and that would not trigger the hook
    Recipe.findById(req.params.id, function (err, recipe) {
        if (err) {
            return res.redirect("back");
        }
        // this will trigger the hook b/c recipe is a document
        recipe.remove(function (err) {
            if (err) {
                console.log(err);
            }
            res.redirect("/recipes");
        });
    });
});

谢谢Mikey,在下面的一行(在钩子中):User.update({pinnedRecipes:{$in:[recipe.\u id]},{$pull:recipe.\u id},{multi:true},function(err){,我得到了一个“语法错误,意外的标记:{”。我如何修复这个问题?另外,它不应该是{$in:recipe.\u id.pinnedRecipes}?非常感谢!缺少花括号
{pinnedRecipes:{$in:[recipe.\u id]}
。我不这么认为。您希望在其数组
pinnedRecipes
中找到所有拥有
recipe.\u id
的用户,然后将其从数组中删除。