Node.js Mongoose未保存到数据库
此REST端点通过从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
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端点“抛硬币”来决定发生什么的声音。有一种更好的方法来编写代码。尤其是当你接受了我刚才说的话