【问题标题】:Meteor insert into collection appears to work, but remains empty流星插入集合似乎工作,但仍然是空的
【发布时间】:2013-07-03 02:33:41
【问题描述】:

我正在做一个简单的插入到一个流星集合中,它看起来有效,但让集合为空。

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

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

【问题讨论】:

    标签: asynchronous meteor


    【解决方案1】:

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

    • 首先,这是:

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

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

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

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

    您可以通过在 shell 中输入 meteor mongo(运行您的 Meteor 应用程序)和 db.comments.find() 来测试此理论,以查看您的 cmets 是否确实在数据库中但未订阅。

    【讨论】:

    • 我检查了我的代码,但忘了注意我的 model.js 中确实有 Meteor.subscribe。我有评论 = new Meteor.Collection("cmets");在主页中,但我对 Post 和 Section 集合也有相同的操作,它们按预期工作。我做了检查,它们在数据库中。任何其他想法为什么他们可能没有显示?
    • Meteor.subscribe(...) 应该在您的客户端代码中,而不是共享...也许更新您问题中的代码?如果我能看到它的位置,应该很容易找到错误:)
    • 我的错误(我仍然需要早上的咖啡)。 Meteor.subscribe() 在客户端,而不是模型上。评论 = new Meteor.Collection("cmets");在model.js文件中。
    • Meteor.subscribe("commments");
    • 就是这样!谢谢你! :)
    【解决方案2】:

    验证您的客户端代码中没有错误。使用 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
                  } 
    }
    

    现在 somevar 函数在 Meteor.call 返回之前在渲染时被调用。因此变量 some_session_var_set_by_a_call 尚未设置。整个事情在未定义的错误上停止了客户端。

    【讨论】:

    • 如您所见,我在插入之前检查错误并记录所有变量。控制台中也没有任何错误。还有什么我可以做的检查吗?另外,我确实根据@emgee 的建议直接检查了数据库,并且显示正在发布 cmets。现在看来问题是客户端代码没有正确访问集合。想法?
    • Erick 我看不到,因为我看不到您的 Meteor.call 函数、渲染函数、辅助函数或您提供给客户端的模板。既然你没有错误,为什么不在 Meteor.call 函数的回调中尝试打印(console.log),看看会发生什么。您还需要在模板中连接某种反应元素(session.get 或游标)以在异步函数稍后返回时对其进行更新。异步函数必须修改该反应变量以创建依赖项。
    • 感谢您的意见。我将“cmets”拼错为“commments”。
    • 这是否破坏了客户端上的代码?我是对的吗?很高兴你知道了!
    • 它没有出错。它只是试图从“评论”集合中的数据库中返回所有内容,但它不存在。感谢您抽出宝贵时间来回顾这一点。 :)
    猜你喜欢
    • 2017-09-14
    • 2019-11-05
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多