簡體   English   中英

為什么我的用於將數據保存到數組的node.js端點在修改數據時會引發錯誤?

[英]why does my node.js endpoint for saving data into array raises error while modifying data?

在我的mongoose模式中,我具有以下用於存儲用戶的模型:

var UsersSchema = new Schema({
    username: {type: String},
    our_username: {type: String},
    our_display_name: {type: String},
    hashtags: {type: [String]}
}

我想在node.js中創建一個端點,以允許用戶更新(添加/刪除)這些標簽,我的用例場景是當用戶登錄到我的應用程序時,我用一個簡單的get端點向他顯示所有標簽:

usersRoutes.get('/:username/hashtags/', functions.validateRequestsGET, function(req, res){
    var username = req.params.username;

    var query;

    if(username != undefined) {
        query = User.find({}).where('username').equals(username).select('hashtags -_id');
    }

    query.exec(function(err, hashtags){
        if(err) {
            res.send(err);
            return;
        }

        res.json(hashtags);
    });
});

但是,如何創建一個允許用戶添加/刪除主題標簽的終結點? 我嘗試了這個:

usersRoutes.post('/:username/', function (req, res) {
    var username = req.params.username;
    var hashtagsToAdd = req.body.hashtagsToAdd;
    var hashtagsToRemove = req.body.hashtagsToRemove;

    console.log(hashtagsToAdd);
    console.log(hashtagsToRemove);

    User.findOneAndUpdate(
        {username: username},
        {
            $push: {"hashtags": hashtagsToAdd},
            $pull: {"hashtags": hashtagsToRemove},
        },
        {safe: true, upsert: true},
        function(err, user) {
            if(err)
                console.log(err);
                return callback(err);

            res.json(user);
        }
    );

});

我用它發送:

{"hashtagsToRemove":["food"], "hashtagsToAdd":["something"]}

到我的端點:

http://localhost:3000/users/randomUsername/

但這會引發錯誤:

message: 'Cannot update \'hashtags\' and \'hashtags\' at the same time'

如何修改端點,使其涵蓋添加/刪除主題標簽的可能性?

您在MongoDB上同時執行$pull$push ,這是不允許的。

您有兩種可能性來實現自己想要做的事情:

選項1

  1. 獲取用戶(使用findOne
  2. user.hashtags屬性手動添加和刪除#標簽
  3. 使用$set運算符更新用戶hashtags屬性。

例:

User.findOne({username: username}, function (err, user) {
  user.hashtags = addToArray(user.hashtags, hashtagsToAdd);
  user.hashtags = removeFromArray(user.hashtags, hashtagsToRemove);
  user.save(function (err, updatedUser) {
    console.log('yeepee');
  });
});

addToArrayremoveFromArray留給練習;-)

選項2

您可以依次更新用戶:使用$push的第一個請求,在回調中使用$pull另一個請求。

功能要求

有一個打開的功能請求: https : //jira.mongodb.org/browse/SERVER-1050但是沒有實現它的計划。

相關問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM