5

我正在做一个简单的插入流星集合,看起来工作,但让集合为空。

该集合在服务器上正确定义:

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() 上没有过滤器。

4

2 回答 2

5

我不确定到底出了什么问题,但这里有几件事要检查。

• 首先,这个:

Meteor.publish("comments", function () {
    return Comments.find();
});

指示服务器发布集合,但实际上并不建立集合服务器端。

您应该Comments = new Meteor.Collection("comments");在客户端和服务器上都可用。我倾向于像示例一样放入一个名为 model.js 的文件。

• 第二种可能性,您没有上面显示的订阅功能,例如Meteor.subscribe("comments");如果您没有订阅功能,您的客户不会知道它,即使它确实存在于集合中。

您可以通过键入meteor mongoshell(运行 Meteor 应用程序)来测试这个理论,并db.comments.find()查看您的评论是否实际上在数据库中但未订阅。

于 2013-07-01T07:32:25.500 回答
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 尚未设置。整个事情在未定义的错误上停止了客户端。

于 2013-07-02T18:14:20.873 回答