如何解决未捕获的ReferenceError:在Meteor.js / MongoDB

时间:2019-09-03 21:18:35

标签: node.js mongodb meteor

我正在通过Eduonix.com参加全日制课程。似乎某些代码语法已被弃用,因为我必须安装多个版本的较旧版本才能浏览某些部分。当我进入Meteor.js部分时,这没有帮助,因此我安装了最新的内容,并进行了一些搜索,使我得以完成第一节课。我在第二课中尝试了相同的方法(遇到此错误时),但是对发现的任何东西都没有碰运气。

尝试使用时出现此错误

todos.find().fetch()

在浏览器的控制台中。

相关文件结构:

client
--main.html
--main.js
lib
--collections.js

View on github

在课程中,该行

import { Todos } from '../lib/collections';

main.js 和该行

中不存在
export const Todos = new Mongo.Collection('todos');
collections.js 中的

表示为

Todos = new Mongo.Collection('todos');

我尝试更改

import { Todos } from '../lib/collections';

import { Todos } from '/lib/collections';

但是它什么也没做。

我也尝试过添加

Todos = new Mongo.Collection('todos');

main.js ,但是我得到一个错误,说“ todos”已经定义(当我尝试运行console命令时,只是得到了相同的未定义错误,因为不知何故两者都已经定义但仍未定义。)

我基于在发布此帖子之前在线查找类似问题进行了这些更改,希望它可以像添加一样节省我

import './main.html';

main.js 的操作是在遇到类似与此错误之前的错误的未定义错误时进行的。

main.html

<head>
  <title>QuickTodos</title>
</head>

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

<Template name="main">
  <header>
    <h1>{{title}}</h1>
  </header>
  <ul>
    {{#each todos}}
      {{> todo}}
    {{/each}}
  </ul>
</template>

<template name="todo">
  <li>{{text}}</li>
</Template>

main.js

import { Template } from 'meteor/templating';
import './main.html';
import { Todos } from '../lib/collections';

const todos = [
  {text:'Pickup kids from school'},
  {text:'Go food shopping'},
  {text:'Meeting with boss'}
];

Template.main.helpers({
  title(){
    return 'QuickTodos';
  },
  todos(){
    return todos;
  }
});

collections.js

import {Mongo} from 'meteor/mongo';

export const Todos = new Mongo.Collection('todos');

我跑步时

todos.find().fetch()

我希望得到一个空数组,但我得到:

VM1905:1 
Uncaught ReferenceError: todos is not defined
    at <anonymous>:1:1

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我注意到的第一件事是这两行的大小写不同,这意味着它们将指向不同的变量(因此,未定义待办事项):

export const Todos = new Mongo.Collection('todos');
todos.find().fetch()

第二件事是,由于Meteor使用CommonJS模块,因此您声明的任何变量都将是该模块的本地变量,并且在控制台上将不可用。
(有一些例外,例如声明的Todos不含varletconst,它们的作用范围是整个应用程序,但仍然不是全局的,或者在控制台)

您可以通过将变量作为属性添加到window来强制其为全局变量:

import { Mongo } from 'meteor/mongo';
export const Todos = new Mongo.Collection('todos');
window.Todos = Todos; // here we make it global

然后,只要client/main.js导入了此文件,就可以在控制台上使用Todos

这对于小型应用程序和测试应用程序来说很好,但是会增加名称冲突的可能性,并使难以理解大型应用程序中代码的来源。

如果要以正确的方式处理模块系统,可以使用require在控制台中访问模块的导出:

> Todos = require('/lib/collections').Todos