流星对象在控制台中可用,但抛出“无法读取属性 findOne of undefined”

Posted

技术标签:

【中文标题】流星对象在控制台中可用,但抛出“无法读取属性 findOne of undefined”【英文标题】:Meteor object available in Console, but throws 'cannot read property findOne of undefined 【发布时间】:2016-09-19 17:10:29 【问题描述】:

我是 Meteor 的新手,我已经被这个问题困扰了好几个小时了。

我在 imports/lib/sessions.js 的文件“sessions.js”中创建了一个集合

import  Meteor  from 'meteor/meteor';
import  Mongo  from 'meteor/mongo';

Sessions = new Mongo.Collection('sessions');

我使用浏览器控制台在数据库中创建了一些文档。然后我想使用模板助手返回一个文档:

import  Template  from 'meteor/templating';
import  Sessions  from '../../../../imports/lib/sessions.js';

Template.CarCamping.helpers(
    test: function() 
        return Sessions.findOne(name: 'David');
    
);

这会引发以下错误:

debug.js:41Exception in template helper: TypeError: Cannot read property 'findOne' of undefined
    at Object.test (http://localhost:3000/app/app.js?hash=e301d24dd47ccd4c73ae01a856896ad67acaaca0:77:32)
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:2994:16
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:1653:16
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3046:66
    at Function.Template._withTemplateInstanceFunc (http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3687:12)
    at http://localhost:3000/packages/blaze.js?hash=ef41aed769a8945fc99ac4954e8c9ec157a88cea:3045:27
    at Spacebars.call (http://localhost:3000/packages/spacebars.js?hash=65db8b6a8e3fca189b416de702967b1cb83d57d5:172:18)
    at Spacebars.mustacheImpl (http://localhost:3000/packages/spacebars.js?hash=65db8b6a8e3fca189b416de702967b1cb83d57d5:106:25)
    at Object.Spacebars.mustache (http://localhost:3000/packages/spacebars.js?hash=65db8b6a8e3fca189b416de702967b1cb83d57d5:110:39)
    at ._render (http://localhost:3000/app/app.js?hash=e301d24dd47ccd4c73ae01a856896ad67acaaca0:30:22)

我已经尝试过的:

确保自动发布已开启,因此订阅或发布数据不会出现问题。 确保创建集合不仅仅在服务器上完成。如果我理解正确,客户端和服务器都可以访问路径“imports/lib/sessions.js”。 html 包含带有模板名称的模板标签

问题是:当我使用 'Sessions.findOne(name: 'David');' 从控制台查询数据库时它确实给了我预期的结果。但从代码本身来看,它不起作用。

非常感谢您的帮助!提前致谢。

【问题讨论】:

【参考方案1】:

您没有从imports/lib/sessions.js 导出Sessions,所以当您转到import 它时,Sessions 将不会被定义。试试这个:

import  Mongo  from 'meteor/mongo';

export const Sessions = new Mongo.Collection('sessions');

您可以在Todos 集合here 中看到类似的模式。

【讨论】:

感谢您的回答。这确实解决了模板中数据不打印的问题。但是,当我在 return 语句中添加一个属性时,如下所示:'return Sessions.findOne(name:'David').name' 我收到一条错误消息:无法读取未定义的属性'name'。名称确实显示在视图中,但控制台不允许我访问集合及其对象? 所以听起来原来的问题已经解决了。您的后续问题是相关的,但我无法在评论中对它们进行彻底的处理。这里有一些快速的想法:(1)可能有几个原因,但听起来你需要一个警卫 - 请参阅this article。 (2) 该集合在您的原始代码中是一个全局变量,现在是一个导出变量。有关如何处理此问题的想法,请参阅 this forum topic。

以上是关于流星对象在控制台中可用,但抛出“无法读取属性 findOne of undefined”的主要内容,如果未能解决你的问题,请参考以下文章

角度处理json对象编译但抛出错误

尝试在 JAVA Spring,@AutoWired 过滤器服务,但抛出 NPE

Django Ajax 表单工作但抛出 500(内部服务器错误)

带有 ***Service 的 Android 防火墙。响应已传递,但抛出 SocketTimeoutException

尽管未设置但抛出 E_STRICT 消息

使用appium在android浏览器上运行selenium webdriver脚本,在模拟器上启动浏览器但抛出chromedriver异常