How to resolve Uncaught ReferenceError: COLLECTION is not defined at <anonymous>:1:1 in Meteor.js/MongoDB

How to resolve Uncaught ReferenceError: COLLECTION is not defined at <anonymous>:1:1 in Meteor.js/MongoDB

我正在通过 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" 已经被定义了(当我试图 运行 控制台命令,因为不知何故它既已定义又仍未定义)。

我在做这个post之前根据在线查找类似问题进行了这些更改,希望它能像添加

一样节省我的时间
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

我做错了什么?

我首先注意到这两行的大小写不同,这意味着它们将指向不同的变量(因此未定义 todos):

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

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

您可以通过将变量作为 属性 添加到 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

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

如果您想以 "right" 方式为模块系统做事,您可以使用 require:

在控制台中访问模块的导出
> Todos = require('/lib/collections').Todos