助手和数据库调用有问题

时间:2014-07-06 15:30:03

标签: mongodb meteor

刚开始学习流星并陷入愚蠢的问题。我有一个集合“图像”,我试图从她那里得到一个随机图像。但是在浏览器的控制台中,它说“无法读取未定义的属性'url',但如果在控制台中键入db的”findOne“方法,则会有我想要的记录。 客户代码:

    Template.main.helpers({
        img: function () {
            return Images.findOne({rand: {$gte: Math.random()}}).url;
        }
    });

收集:

    Images = Meteor.Collection('images');

在服务器端,我有初步测试的简单装置

    if(Images.find().count() === 0){
        Images.insert({url: "http://domain.com/test1.jpg", rand: Math.random()});
        Images.insert({url: "http://domain.com/test2.jpg", rand: Math.random()});
        Images.insert({url: "http://domain.com/test3.jpg", rand: Math.random()});
    }

简单的模板:

    <head>
      <title>Test</title>
    </head>

    <body>
      {{> main}}
    </body>

    <template name="main">
      {{img}}
    </template>

P.S。我在Win 8下工作。

2 个答案:

答案 0 :(得分:1)

加载模板时,您需要小心谨慎。当您的网页加载到网络浏览器上时,它不一定有任何数据(您的Images.findOne()查询可能会返回null

你只需要考虑到这种可能性

var image = Images.findOne({rand: {$gte: Math.random()}});
return image && image.url

答案 1 :(得分:1)

首先,我假设图像已发布到客户端。您应该在浏览器控制台中验证Images.find().count() > 0true(而不是模板代码中)。

接下来,您应该阅读有关如何为模板代码添加防护以修复您看到的错误的信息。 This article应该解释你需要知道什么。

最后,除非您的文档确实需要rand,否则有更好的方法可以完成随机选择。您的问题是说您正在寻找一个图像,但您的代码可能会返回1或0。相反,您可以使用内置的Random包。试一试:

Template.main.helpers({
  img: function() {
    var image = Random.choice(Images.find().fetch());
    return image && image.url;
  }
});

虽然,我认为返回图像对象更有意义:

Template.main.helpers({
  image: function() {
    return Random.choice(Images.find().fetch());
  }
});

然后在模板中选择url(在这种情况下不需要警卫):

<template name="main">
  <img src="{{image.url}}">
</template>