为什么我不能在第一个回调函数中更新这个MongodDB文档(虽然我能够在没有问题的情况下更新不同的文档)?

时间:2016-01-27 16:42:24

标签: node.js mongodb express mongoose

很抱歉,如果标题令人困惑,我很难在一个问题中总结问题。我目前正在使用MEAN堆栈实现一个非常通用的文章发布/阅读Web应用程序的评论系统。

我目前拥有AuthorArticleComment的模型,如下所示(省略了像createdBy这样的无关字段):

var AuthorSchema = new Schema({
    // removing unnecessary fields  
    articles: [{
        type: Schema.ObjectId,
        ref: 'Article'
    }],
    comments: [{     // want to find all of a users comments quickly
        type: Schema.ObjectId,    
        ref: 'Comment'
    }]
    ...
}

var CommentSchema = new Schema({
    // removing unnecessary fields  
    content: {
        type: String
    },
    author: {  // I want to be able to find a comment's author quickly
        type: Schema.ObjectId,
        ref: 'Author'
    },
    ...
}

var ArticleSchema = new Schema({
    content: {
        type: String
    },
    author: {
        type: Schema.ObjectId,
        ref: 'Author'
    },
    comments: [{
        type: Schema.ObjectId,
        ref: 'Comment'
    }]
    ...       
}

以下是我在评论控制器中创建评论的代码:

commentCtrl.createComment = function(req, res, next) {
var comment = new Comment(req.body);
if (req.user) {
    comment.author = req.user;
    // the desired article is stored on the req object by earlier middleware
    req.article.comments.unshift(comment); // naive way to add comment
    req.article.save(
        function(err) {
        if (err) {
            return sendError(res, 400, getErrorMessage(err));
        } else {
            Author.findByIdAndUpdate(
                req.user._id,
                {$push: {comments: comment}},
                function(err){
                    res.json(comment);
                }
            )
        }
    });

}
else {
    return sendError(res, 401,'The user is not logged in.');
}
};

所以现在是奇怪的部分。作者正在将注释正确地存储在comments数组字段中,而文章却没有。执行后,这里是引用作者的文章的控制台日志(同样,为清楚起见,我删除了不相关的字段):

{ _id: 56a7b5028bffef9e1ba58ab4,
  author: 
   { _id: 56a7b1791a5f728c1bb1ee99,
     username: 'xTest1',
     comments: 
      [ 53a78291a5f728c1bbcef9b ],
     articles: 
      [ 53a78291a5f728c1bbcef9a ],
   },
  title: 'Test article',
  content: '...',
  comments: []
}

我最初的想法是,我对注释数组中取消注释的天真方法不起作用,所以虽然我已经在req对象上有了文章对象,但我更改了实现以模仿似乎正在工作的代码更新作者:

Article.findByIdAndUpdate(
    req.article._id,
    {$push: {comments: comment}},
    function(err){ ... // same inner function as above (to update author)
    }
}

根本没有改变任何东西。我没有收到任何错误消息(这是有道理的,因为内部回调工作正常),所以我不知道发生了什么。

1 个答案:

答案 0 :(得分:0)

我发现了问题,我觉得有点傻。希望通过回答我自己的问题,我可以防止其他人犯同样的错误。

我没有在数据库中创建Comment文档。我只是在应用程序中创建一个Comment,然后在Author和Article文档中存储对它的引用(或者更确切地说,试图)。

解决方案是首先在数据库中保存Comment,然后在成功的回调函数中执行原始代码。

我无法弄清楚的一件事是它为什么成功地在Author对象中存储引用?如果有人有这方面的想法,它可能会揭示我无法预见的一些休眠问题。