0

我对编程有点陌生,希望有人能帮我找出我的应用程序的问题。这是我在 Github 中的 Repo 的链接

错误:

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.
4

2 回答 2

1

有许多问题主要与应用程序文件夹结构和流星中的包的使用有关。

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

您遇到的问题是您的 jQuery 插件和 Stripe 模块位于您的项目根目录中,因此当服务器端代码查看 jQuery 时,它不知道该做什么,而当客户端查看您的 Stripe 模块的所有代码时,这些代码就像一个节点一样编写.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 制作的 Stripe 包(https://atmosphere.meteor.com/package/stripe) 只需从项目的根目录执行“mrt add stripe”。接下来删除您当前拥有的 node_modules 文件夹。从现在开始在命令行中运行您的流星应用程序类型“mrt”而不是“流星”,这是必需的,因为您现在在此应用程序中使用陨石包,对于不使用陨石包的未来应用程序,您可以继续只需使用“流星”

其他小错误:

  • 在第 11 行 myMusicApp.html 您引用模板名称 {{> Playlist}} 而不是 Playlists
  • 在第 32 行 myMusicApp.js 上,您通过 $("#jquery_jplayer_1").jplayer({... 调用 jPlayer,但您必须使用大写字母 P 即 $("#jquery_jplayer_1").jPlayer当涉及到大写字母或缺少时,这​​些东西非常具体)
  • 最后一个错误来自您在 myMusicApp.js 中的事件,特别是 okCancelEvents 的东西。我不确定您要在那一点上做什么,它上面的 mousedown、click 和 dblclick 事件看起来不错。
于 2013-10-06T23:50:18.823 回答
-1

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”。(节点知道将 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)在节点中工作,但在浏览器中没有全局。所以它没有达到它的目的。

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

于 2017-01-31T20:48:47.917 回答