我正在对流星集合进行简单的插入,看起来很有效,但是将集合留空了。
在服务器上正确定义了集合:
Meteor.publish("comments", function () {
return Comments.find();
});
在client.js中正确订阅:
Meteor.subscribe("commments");
并在model.js上正确设置:
Comments = new Meteor.Collection("comments");
插入代码如下:
Meteor.methods({
addComment: function (options) {
check(options.post_id, String);
check(options.comment, NonEmptyString);
if (! this.userId)
throw new Meteor.Error(403, "You must be logged in to comment.");
if (options.comment.length > 1000)
throw new Meteor.Error(413, "Comment is too long");
var post = Posts.findOne(options.post_id);
if (! post)
throw new Meteor.Error(404, "No such post");
// add new comment
var timestamp = (new Date()).getTime();
console.log('Comment: ' + options.comment);
console.log('Post: ' + options.post_id);
console.log('UserId: ' + this.userId);
var saved = Comments.insert({
owner: this.userId,
post_id: options.post_id,
timestamp: timestamp,
text: options.comment});
console.log('Saved: ' + saved);
}
});
调用插入后,控制台会输出以下内容:
Comment: Something
Post: xRjqaBBEMa6qjGnDm
UserId: SCz9e6zrpcQrKXYWX
Saved: FCxww9GsrDsjFQAGF
> Comments.find().count()
0
我已插入其他几个工作正常的集合(帖子就是其中之一,因为你可以在代码中看到帖子ID)。在文档中,ist表示如果插入错误,它将打印到控制台,但正如您所看到的那样它似乎正在工作,但实际上是空的。
感谢。
更新:我确实发现数据被放入数据库,但由于某种原因没有显示出来。我不确定为什么数据没有正确发布,因为find()上没有过滤器。
答案 0 :(得分:5)
我不确定到底出了什么问题,但这里有一些事情需要检查。
•首先,这个:
Meteor.publish("comments", function () {
return Comments.find();
});
指示服务器发布Collection,但实际上并不建立集合服务器端。
您应该在客户端和服务器上都有Comments = new Meteor.Collection("comments");
。我倾向于放入一个名为model.js的文件,就像examples那样。
•第二种可能性,您没有上面显示的订阅功能,例如Meteor.subscribe("comments");
如果您没有订阅功能,您的客户端将不会知道它,即使它确实如此存在于集合中。
您可以通过在shell中键入meteor mongo
(运行Meteor应用程序)和db.comments.find()
来测试此理论,以查看您的注释是否实际位于数据库中但未订阅。
答案 1 :(得分:0)
确认您的客户端代码中没有错误。使用Meteor.call,如果你没有初始化一个变量,你可能会遇到一个错误条件,它会阻止模板中的被动更新,但是你可以在手边继续写好你的控制台。
我犯了这个错误,我在这里谈到: http://doctormehmet.blogspot.com/2013/07/revoltdc-hackathon-20130622-iteration-3.html
特别是我有类似
的东西Template.mytemplate.helpers({
somevar: function({
if (some_session_var_set_by_a_call.party){
//do something
}
}
现在,在Meteor.call返回之前,在渲染上调用somevar函数。因此,尚未设置变量some_session_var_set_by_a_call。整个过程会阻止客户端出现未定义的错误。