很抱歉,如果标题令人困惑,我很难在一个问题中总结问题。我目前正在使用MEAN堆栈实现一个非常通用的文章发布/阅读Web应用程序的评论系统。
我目前拥有Author
,Article
和Comment
的模型,如下所示(省略了像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)
}
}
根本没有改变任何东西。我没有收到任何错误消息(这是有道理的,因为内部回调工作正常),所以我不知道发生了什么。
答案 0 :(得分:0)
我发现了问题,我觉得有点傻。希望通过回答我自己的问题,我可以防止其他人犯同样的错误。
我没有在数据库中创建Comment文档。我只是在应用程序中创建一个Comment,然后在Author和Article文档中存储对它的引用(或者更确切地说,试图)。
解决方案是首先在数据库中保存Comment,然后在成功的回调函数中执行原始代码。
我无法弄清楚的一件事是它为什么成功地在Author对象中存储引用?如果有人有这方面的想法,它可能会揭示我无法预见的一些休眠问题。