2

如果您想用两个词来了解此线程中的问题: 我正在尝试完成一个猫鼬函数 findOrAdd():如果我正在搜索的 Id 不存在,我应该添加一个新文档。之后(这就是我需要一些同步功能的原因)我需要根据新的 ObjectId 进行另一个查询。

这是我的帖子架构

var com_post_schema = new Schema({
content: { type: String, required: true },
postedBy: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'com_user'
    }]
});

和我的用户架构

var com_user_schema = new Schema({
    name: { type: String, required: true },
    age: {type:Number}
});

所以一篇文章可以有多个作者。我的问题:作者可以是现有用户(在 bootstrap-tokenfield 中选择)或新用户,请参阅此 json 示例:

{
   "content":"post content",
   "postedBy":[
      {
         "_id":"56a60a972b70225014753d1a",
         "name":"Paul",
         "age":20,
         "__v":0,
         "value":"Paul",
         "label":"Paul"
      },
      {
         "value":"John",
         "label":"John"
      }
   ]
}

用户 Paul 已经存在于“com_user”集合中,我必须将用户 John 保存在“com_user”中,然后使用用户 ObjectIds refs 保存帖子(字段“value”和“label”由 bootstrap-tokenfield 发送) . 我不清楚我该怎么做。

编辑 这是我当前的代码我仍然有同步问题。我做了一些测试,我在控制台中随机看到“添加了新帖子”,然后是“找不到用户..”

尝试 3 个用户,看看..

app.post('/api/community/posts', function(req,res){
var arr=[],i=0;
req.body.postedBy.forEach(function(el){

    com_user.findById(el._id, function (err, user) {
        if(user) {
            console.log("User found!");
            console.log(user);
            arr.push(mongoose.Types.ObjectId(user._id ));
            i++;

            if(i==req.body.postedBy.length-1) {
                console.log('UFi'+i)
                console.log(arr)
                var com_post1= new com_post({
                    content:req.body.content,
                    postedBy:arr,

                });
                com_post1.save(function(err){
                    if(!err){
                        console.log("New post added!");
                        res.json({"New post added! ":req.body.content});
                    }
                    else {
                        res.json({"Error adding post":'error'});
                        error(err)
                    }
                });
            }

        }
        else {
            var com_user1= new com_user({
                name:el.label,
                age: 20
            });
            com_user1.save(function(err,newuser){
                if(err)
                    console.log(err)
                else {
                    console.log('User not found and just added!');
                    console.log(newuser)
                    arr.push(mongoose.Types.ObjectId(newuser._id));
                    console.log(arr)
                    i++;
                    if(i==req.body.postedBy.length-1) {
                        console.log('NUFi'+i)

                        console.log(arr)
                        var com_post1= new com_post({
                            content:req.body.content,
                            postedBy:arr,

                        });
                        com_post1.save(function(err){
                            if(!err){
                                console.log("New post added!");
                                res.json({"New post added! ":req.body.content});
                            }
                            else {
                                res.json({"Error adding post":'error'});
                                error(err)
                            }
                        });
                    }
                }
            });
        }
    });

});
});
4

1 回答 1

2

这是因为 forEach 之后的代码在 forEach 完成之前执行。像这样试试

app.post('/api/community/posts', function(req,res){
var arr=[],i=0;
req.body.postedBy.forEach(function(el){

    com_user.findById(el._id, function (err, user) {
        if(user) {
            console.log("User found!");
            console.log(user);
            arr.push(mongoose.Types.ObjectId(user._id ));
            i++;
            if(i==req.body.postedBy.length-1) { //to ensure forEach is complete
                console.log(arr)
                var com_post1= new com_post({
                    content:req.body.content,
                    postedBy:arr,

                });
                com_post1.save(function(err){
                    if(!err)
                        res.json({"New post added! ":req.body.content});
                    else {
                        res.json({"Error adding post":'error'});
                        error(err)
                    }
                });
            }
        }
        else {
            var com_user1= new com_user({
                name:el.label,
                age: 20
            });
            com_user1.save(function(err,newuser){
                if(err)
                    console.log(err)
                else {
                    console.log('User not found and just added!');
                    console.log(newuser)
                    arr.push(mongoose.Types.ObjectId(newuser._id));
                    i++;
                    if(i==req.body.postedBy.length-1) {
                        console.log(arr)
                        var com_post1= new com_post({
                            content:req.body.content,
                            postedBy:arr,

                        });
                        com_post1.save(function(err){
                            if(!err)
                                res.json({"New post added! ":req.body.content});
                            else {
                                res.json({"Error adding post":'error'});
                                error(err)
                            }
                        });
                    }
                }
            });
        }
    });

});

于 2016-02-01T18:36:06.267 回答