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
在课程中,行
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 模块,您声明的任何变量都将是该模块的本地变量,并且不会在控制台上可用。
(有一些例外,比如没有 var
、let
或 const
声明的 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
我正在通过 Eduonix.com 学习完整的堆栈课程。似乎某些代码语法已被弃用,因为我必须安装多个旧版本才能完成某些部分。当我来到 Meteor.js 部分时,这没有帮助,所以我安装了最新的并进行了一些搜索,使我能够完成第一课。我在第二课中尝试了同样的方法(当我遇到这个错误时),但是我发现的任何东西都没有运气。
当我尝试使用
时出现此错误todos.find().fetch()
在浏览器的控制台中。
相关文件结构:
client
--main.html
--main.js
lib
--collections.js
在课程中,行
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 模块,您声明的任何变量都将是该模块的本地变量,并且不会在控制台上可用。
(有一些例外,比如没有 var
、let
或 const
声明的 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