Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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
Node.js Mongoose未保存到数据库_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose未保存到数据库

Node.js Mongoose未保存到数据库,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,此REST端点通过从user.favorites中删除qname来更新我的数据库中的收藏夹列表 我的问题是,尽管代码末尾的updateUser.Favorites是正确的,但实际上并没有将其保存在数据库中(类似于在单独端点上添加qname的代码)。我相信这是一个愚蠢的错误,但我所写的直觉上是正确的 exports.remQname = function (req, res, next) { var userId = req.user.id; var qname = req.par

此REST端点通过从
user.favorites
中删除
qname
来更新我的数据库中的收藏夹列表

我的问题是,尽管代码末尾的
updateUser.Favorites
是正确的,但实际上并没有将其保存在数据库中(类似于在单独端点上添加qname的代码)。我相信这是一个愚蠢的错误,但我所写的直觉上是正确的

exports.remQname = function (req, res, next) {
    var userId = req.user.id;
    var qname = req.params.qname;

    console.log('addQname %s %s', userId, qname);
    User.findOne({
        _id: userId
    }, function(err, user) {
        if (err) return next(err);
        if (!user) return res.json(401);

        console.log(user);

        // if the qname already in list, remove it, otherwise add it
        var favourites = user.favourites;
        var matches = _.remove(favourites, function (f) {
            return f == qname
        });
        console.log('Matches: %s %s', matches, favourites);

        user.favourites = favourites;
        user.save(function(err, updatedUser){
            if (err) throw err;
            console.log(updatedUser);  // correct info, but does not reflect database content
            res.status(200).send(updatedUser.favourites);
        });
    });     
};
这是我的模式

var UserSchema   = new Schema({
    email: String,
    password: String,
    token: String,
    role: {type: String, default: 'user'},
    favourites: Array
});

module.exports = mongoose.model('User', UserSchema);

这与lodash有关-这反而有效

    var newFavs = _.reject(user.favourites, function (f) {
        return f == qname
    });

    console.log('Favourites - Old: %s New: %s', user.favourites, newFavs);

    // delete user.favourites;
    user.favourites = newFavs;

这与lodash有关-这反而有效

    var newFavs = _.reject(user.favourites, function (f) {
        return f == qname
    });

    console.log('Favourites - Old: %s New: %s', user.favourites, newFavs);

    // delete user.favourites;
    user.favourites = newFavs;

这与lodash有关-这反而有效

    var newFavs = _.reject(user.favourites, function (f) {
        return f == qname
    });

    console.log('Favourites - Old: %s New: %s', user.favourites, newFavs);

    // delete user.favourites;
    user.favourites = newFavs;

这与lodash有关-这反而有效

    var newFavs = _.reject(user.favourites, function (f) {
        return f == qname
    });

    console.log('Favourites - Old: %s New: %s', user.favourites, newFavs);

    // delete user.favourites;
    user.favourites = newFavs;

您可以使用直接从数组字段中删除特定值的所有实例,因此让MongoDB来完成这项工作比自己操作数组更有效

User.update({u id:userId},
{$pull:{收藏夹:qname}},
函数(err,numberraffected,raw){…};

我还建议将模式中的
收藏夹
的定义更改为
[String]
,而不是只定义
数组
,如果它确实包含字符串数组。

您可以使用,因此,让MongoDB来完成这项工作比自己操作数组更有效

User.update({u id:userId},
{$pull:{收藏夹:qname}},
函数(err,numberraffected,raw){…};

我还建议将模式中的
收藏夹
的定义更改为
[String]
,而不是只定义
数组
,如果它确实包含字符串数组。

您可以使用,因此,让MongoDB来完成这项工作比自己操作数组更有效

User.update({u id:userId},
{$pull:{收藏夹:qname}},
函数(err,numberraffected,raw){…};

我还建议将模式中的
收藏夹
的定义更改为
[String]
,而不是只定义
数组
,如果它确实包含字符串数组。

您可以使用,因此,让MongoDB来完成这项工作比自己操作数组更有效

User.update({u id:userId},
{$pull:{收藏夹:qname}},
函数(err,numberraffected,raw){…};

我还建议将模式中的
收藏夹
的定义更改为
[String]
,而不只是
数组
,如果它确实包含字符串数组的话。

听起来不是很安静。“。添加或删除…”。API应该完全按照它所描述的做。所以在REST术语中,您发布到“添加”,放置到更改,删除到删除,然后获取。我不喜欢API端点“抛硬币”来决定发生什么的声音。有一种更好的方法来编写代码。特别是当你接受我刚才所说的,不同的动词导致不同的行为,而不是“检查”一个“状态变化”。公正的评论,以及一些我需要改变的东西。但我仍然会使用上面的代码来提供一个删除路径,它不会去工作地点,而这正是你失去我的地方。我不想有朝一日遇到这条路线,然后发现它“添加或删除”取决于存在的内容。所以我不会帮你做我不同意的事情。@NeilLunn:没问题。我已经改变了问题,以避免你们的担忧,这听起来不是很平静。“。添加或删除…”。API应该完全按照它所描述的做。所以在REST术语中,您发布到“添加”,放置到更改,删除到删除,然后获取。我不喜欢API端点“抛硬币”来决定发生什么的声音。有一种更好的方法来编写代码。特别是当你接受我刚才所说的,不同的动词导致不同的行为,而不是“检查”一个“状态变化”。公正的评论,以及一些我需要改变的东西。但我仍然会使用上面的代码来提供一个删除路径,它不会去工作地点,而这正是你失去我的地方。我不想有朝一日遇到这条路线,然后发现它“添加或删除”取决于存在的内容。所以我不会帮你做我不同意的事情。@NeilLunn:没问题。我已经改变了问题,以避免你们的担忧,这听起来不是很平静。“。添加或删除…”。API应该完全按照它所描述的做。所以在REST术语中,您发布到“添加”,放置到更改,删除到删除,然后获取。我不喜欢API端点“抛硬币”来决定发生什么的声音。有一种更好的方法来编写代码。特别是当你接受我刚才所说的,不同的动词导致不同的行为,而不是“检查”一个“状态变化”。公正的评论,以及一些我需要改变的东西。但我仍然会使用上面的代码来提供一个删除路径,它不会去工作地点,而这正是你失去我的地方。我不想有朝一日遇到这条路线,然后发现它“添加或删除”取决于存在的内容。所以我不会帮你做我不同意的事情。@NeilLunn:没问题。我已经改变了问题,以避免你们的担忧,这听起来不是很平静。“。添加或删除…”。API应该完全按照它所描述的做。所以在REST术语中,您发布到“添加”,放置到更改,删除到删除,然后获取。我不喜欢API端点“抛硬币”来决定发生什么的声音。有一种更好的方法来编写代码。尤其是当你接受了我刚才说的话