【问题标题】:Meteor Reference Error流星参考误差
【发布时间】:2017-02-01 04:48:47
【问题描述】:

我对编程有点陌生,希望有人能帮我找出我的应用程序的问题。 Here is the link to my Repo in Github.

错误:

W202306-18:14:53.145(-4)? (STDERR) /Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:184
W202306-18:14:53.146(-4)? (STDERR) }).run();
W202306-18:14:53.146(-4)? (STDERR)    ^
W202306-18:14:53.147(-4)? (STDERR) ReferenceError: require is not defined
W202306-18:14:53.148(-4)? (STDERR)     at app/node_modules/stripe/test/charges.js:1:47
W202306-18:14:53.148(-4)? (STDERR)     at app/node_modules/stripe/test/charges.js:65:3
W202306-18:14:53.149(-4)? (STDERR)     at mains (/Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:153:10)
W202306-18:14:53.149(-4)? (STDERR)     at Array.forEach (native)
W202306-18:14:53.149(-4)? (STDERR)     at Function._.each._.forEach (/Users/Ed/.meteor/tools/3cba50c44a/lib/node_modules/underscore/underscore.js:79:11)
W202306-18:14:53.150(-4)? (STDERR)     at /Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:80:5
=> Exited with code: 1
=> Your application is crashing. Waiting for file change.

【问题讨论】:

    标签: javascript html meteor


    【解决方案1】:

    存在一些主要与应用程序文件夹结构和meteor中的包使用有关的问题。

    1.) 应用结构:默认情况下,项目中的每个文件流星都会尝试在客户端和服务器端加载它。如果要为客户端和服务器分离文件,则需要使用将它们放在客户端和服务器文件夹中。还有其他重要的文件夹名称,meteor 会查找包、lib 等。这些在meteor 文档的“构建您的应用程序”部分中进行了解释:http://docs.meteor.com

    您遇到的问题是您的 jQuery 插件和 Stripe 模块位于您的项目根目录中,因此当服务器端代码查看 jQuery 时,它不知道该做什么,而当客户端查看您编写的所有 Stripe 模块代码时就像一个 node.js 应用程序,它不知道如何处理它。

    现在您确实有一个“客户端”文件夹,但正如我刚刚在查看您的问题时发现的那样,meteor 非常挑剔,因此要求它全部为小写。所以首先将客户端文件夹重命名为客户端。接下来将 jquery-jplayer 文件夹移动到客户端文件夹中。最后,我建议创建一个服务器文件夹并将您的节点模块移动到那里,但我会建议一个更好的方法......

    2.) 使用带有流星的软件包:使用标准 node.js 应用程序,您只需执行“npm install module-name”即可。在流星包中,处理方式往往不同。首先,您可以通过执行 Npm.require('module-name'); 来请求包服务器端,而不是执行 npm install;其次,包有一种标准的制作方式,在流星文档的“编写包”中进行了解释。我将为您保存所有详细信息,并仅说明如何让 Stripe 在您的应用中运行。

    幸运的是,其他人已经为 Meteor 创建了一个 Stripe 包。除了与流星捆绑的标准软件包(如骨干网、帐户等)外,还有一个由社区成员制作的软件包存储库。要安装这些软件包,您需要安装一个名为 meteorite 的命令行工具。此处解释了这样做的详细信息:https://atmosphere.meteor.com/wtf/app。然后要安装由 Tyler Johnson (https://atmosphere.meteor.com/package/stripe) 制作的 Stripe 包,只需从项目的根目录执行“mrt add stripe”。接下来删除您当前拥有的 node_modules 文件夹。从现在开始在命令行中运行您的流星应用程序类型“mrt”而不是“流星”,这是必需的,因为您现在在此应用程序中使用陨石包,对于不使用陨石包的未来应用程序,您可以继续只需使用“流星”

    其他小错误:

    • 在第 11 行 myMusicApp.html 您引用模板名称 {{> Playlist}} 而不是 Playlists
    • 在第 32 行 myMusicApp.js 上,您通过 $("#jquery_jplayer_1").jplayer({... 但是您必须使用大写字母 P,即 $("#jquery_jplayer_1").jPlayer(您会在编程中发现,当涉及到大写字母或缺少时,这​​些内容非常具体)
    • 最后一个错误来自您在 myMusicApp.js 中的事件,特别是 okCancelEvents 内容。我不确定您在该位中尝试做什么,它上面的 mousedown、click 和 dblclick 事件看起来不错。

    【讨论】:

    • 这没有解决 ReferenceError
    【解决方案2】:

    ReferenceError 是节点错误。 Meteor 是一个基于 Node.js 的框架。

    Node 具有全局范围(又名 Node 的 global 变量)。 如果您尝试访问未定义的全局变量,Node(不是 Meteor)会抛出此错误。

    浏览器还有一个名为 window 的全局作用域,并且在访问未定义的变量时不会抛出 ReferenceErrors。

    这是我喜欢为类添加功能的一种模式(它非常像 Meteor):

    /lib/Helpers.js      <-- Helpers for everyone (node+browser)
    /server/Helpers.js   <-- Server helpers (node)
    /client/Helpers.js   <-- Client helpers (browser)
    

    考虑这些实现:

    // /lib/Helpers.js
    Helpers = {/* functions */};  // Assigned to window.Helpers and global.Helpers
    
    // /server/Helpers.js
    Helpers = _.extend(Helpers, {/*more functions*/}
    
    // /client/Helpers.js
    Helpers = _.extend(Helpers, {/*more functions*/}
    

    这是一个简单的例子。如果我不想担心加载顺序怎么办?为什么不在 /lib/Helpers.js 中使用 _.extend()?

    // /lib/Helpers.js
    // Helpers = {/* functions */};                  // Overwrites...
    Helpers = _.extend(Helpers, {/* functions */});  // ReferenceError
    

    因为如果未定义 Helpers,您将从 Node 收到 ReferenceError - 特别是用作参数的“Helpers”。 (Node 知道将 Helpers 分配为 global.Helpers)。

    这里有两种“修复”此问题的方法:

    1) 为某事分配助手

    // /lib/Helpers.js
    // Helpers = Helpers || {};   // Also a ReferenceError
    if (typeof Helpers === 'undefined') Helpers = {};
    Helpers = _.extend(Helpers, {/* functions */});
    

    2) 使用来自全局的帮助器

    // /lib/Helpers.js
    Helpers = _.extend(global.Helpers, {/* functions */});  // works in node, but...
    

    两者都很糟糕。

    1) 的语法很糟糕。但我猜第一次声明很好。 2)在节点中工作,但在浏览器中没有全局。所以它没有达到它的目的。

    如果您对此有方便的跨平台语法,请发表评论:-)

    【讨论】:

    • 请不要发布相同的答案。如有必要,将问题标记为重复问题,或针对单个问题定制您的答案。
    • @miken - 不错!您隐藏了作为热门搜索结果出现的问题的正确答案!你在帮助谁?现在我记得为什么我不浪费时间在这里回答问题了。
    • 其实这是一个质量很差的问题,在被问到之后的 3.5 年里只被浏览了 1000 次。提问者没有尝试调试问题,甚至没有提供他们的代码。 IMO 这些不是需要回答的问题;如果其他人有不同的看法,他们会支持你的答案,并忽略我在这个问题上的 VTC。 (而且这一切都不会改变发布相同答案的事实,并且会自动引发审核标志。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多