运行Meteor bundle的Raspberry Pi会抛出调用堆栈exception

我已经在Raspberry Pi上安装了Node.js,我正在试图运行Meteor.js排行榜的例子。 我已经捆绑了它,并将其复制到Pi。 我已经安装了我的MONGO_URL和NPM光纤(经过一些麻烦)。 当我尝试运行时:

$ node main.js 

我得到Maximum call stack size exceededexception。

  /home/pi/bundle/server/server.js:143 }).run(); ^ RangeError: Maximum call stack size exceeded 

我用--trace运行命令,得到这个:

  /home/pi/bundle/server/server.js:143 1: GetLineNumber+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) { 2: ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080a1 <true>) { 3: ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) { 4: ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) { 4: } -> 151 4: SUB+48(this=151, 1) { 4: } -> 150 4: ADD+52(this=0, 150) { 4: } -> 150 4: SAR+48(this=150, 1) { 4: } -> 75 4: ADD+52(this=75, 1) { 4: } -> 76 4: SUB+48(this=146, 1) { 4: } -> 145 4: SUB+48(this=146, 1) { 4: } -> 145 3: } -> 142 3: SUB+48(this=142, 1) { 3: } -> 141 3: ADD+52(this=4630, 1) { 3: } -> 4631 3: SUB+48(this=4642, 1) { 3: } -> 4641 3: charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) { 3: } -> 0x37324625 <String[1]: ;> 3: SUB+48(this=4636, 4631) { 3: } -> 5 3: ADD+52(this=142, 0) { 3: } -> 142 3: new SourceLocation+40(this=0x26694b99 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) { 3: } -> 0x4e908091 <undefined> 2: } -> 0x26694b99 <a SourceLocation> 2: ADD+52(this=142, 1) { 2: } -> 143 1: } -> 143 /home/pi/bundle/server/server.js:143 1: GetSourceLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) { 2: ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080a1 <true>) { 3: ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) { 4: ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) { 4: } -> 151 3: } -> 142 3: charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) { 3: } -> 0x37324625 <String[1]: ;> 3: new SourceLocation+40(this=0x26694ce5 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) { 3: } -> 0x4e908091 <undefined> 2: } -> 0x26694ce5 <a SourceLocation> 2: SourceLocationRestrict+60(this=0x26694ce5 <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) { 3: SUB+48(this=78, 10) { 3: } -> 68 3: SUB+48(this=4642, 4631) { 3: } -> 11 2: } -> 0x4e908091 <undefined> 2: SourceLocationSourceText+40(this=0x26694ce5 <a SourceLocation>) { 3: substring+64(this=0x3735a0cd <Very long string[4703]>, 4631, 4642) { 3: } -> 0x26694d29 <String[11]: }).run();> 2: } -> 0x26694d29 <String[11]: }).run();> 1: } -> 0x26694d29 <String[11]: }).run();> }).run(); 1: GetPositionInLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) { 2: ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080b1 <false>) { 3: ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) { 4: ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) { 4: } -> 151 3: } -> 142 3: charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) { 3: } -> 0x37324625 <String[1]: ;> 3: new SourceLocation+40(this=0x26694d71 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) { 3: } -> 0x4e908091 <undefined> 2: } -> 0x26694d71 <a SourceLocation> 2: SourceLocationRestrict+60(this=0x26694d71 <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) { 2: } -> 0x4e908091 <undefined> 2: SUB+48(this=4636, 4631) { 2: } -> 5 1: } -> 5 1: GetPositionInLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) { 2: ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080b1 <false>) { 3: ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) { 4: ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) { 4: } -> 151 3: } -> 142 3: charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) { 3: } -> 0x37324625 <String[1]: ;> 3: new SourceLocation+40(this=0x26694e7d <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) { 3: } -> 0x4e908091 <undefined> 2: } -> 0x26694e7d <a SourceLocation> 2: SourceLocationRestrict+60(this=0x26694e7d <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) { 2: } -> 0x4e908091 <undefined> 1: } -> 5 ^ 1: ToString+40(this=0x4e92928d <JS Object>, 0x4e908091 <undefined>) { 1: } -> 0x373080bd <String[9]: undefined> 1: getter+40(this=0x26693e85 <a RangeError>) { 2: +40(this=0x4e908091 <undefined>, 0x4e96824d <a RangeError>) { 3: FormatMessage+72(this=0x4e908091 <undefined>, 0x26694ed5 <JSMessageObject>) { 4: ADD+52(this=0, 1) { 4: } -> 1 4: ADD+52(this=1, 0) { 4: } -> 1 4: ADD+52(this=0, 2) { 4: } -> 2 4: FormatString+64(this=0x4e908091 <undefined>, 0x2669611d <JS array[1]>, 0x26694ed5 <JSMessageObject>) { 5: ADD+52(this=0x373082e5 <String[0]: >, 0x59c1f9cd <String[32]: Maximum call stack size exceeded>) { 5: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> 5: ADD+52(this=1, 0) { 5: } -> 1 4: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> 3: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> 2: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> 1: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> RangeError: 1: getter+40(this=0x26693e85 <a RangeError>) { 1: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded> Maximum call stack size exceeded 

我可以跟踪这个问题的最后一个地方是在文件中:

app/packages/mongo-livedata/mongo_driver.js

在10号线附近:

var MongoDB = __meteor_bootstrap__.require('mongodb');

我安装了最新的npm(1.1.50),并且在全球安装了npm mongodb。 我在mongolab.com上指向一个托pipe的mongodb。 我创build了一个简单的testing来连接并插入一些logging。 它使用了我正在尝试用于Meteor的完全相同的URL,它按预期工作:

 var connect = require('mongodb').connect; var url = 'mongodb://<user>:<password>@<cloud_id>.mongolab.com:<port>/<database>'; connect(url, function(err, db) { db.collection('test', function(err, collection) { // Insert 3 records for(var i = 0; i < 3; i++) { collection.insert({'a':i}); } }); }); 

我不太了解跟踪消息,但它似乎像FormatString调用是什么触发exception。 有什么build议么?

更新:

我已经debugging了这一点,并隔离了这里显示的一个特定的mongodb模块加载为filename 。 通过一段时间,它似乎是模块recursion包括自己。

 break in module.js:311 Watchers: 0: path = ... 1: parent = ... 2: filename = "/home/pi/bundle/server/node_modules/mongodb/lib/mongodb/connection/repl_set.js" 308 var hadException = true; 309 310 try { 311 module.load(filename); 312 hadException = false; 313 } finally { 314 if (hadException) { 315 delete Module._cache[filename]; 316 } 317 } debug> < RangeError: Maximum call stack size exceeded program terminated 

不幸的是,我不认为MongoDB目前支持ARM架构,请参阅https://jira.mongodb.org/browse/SERVER-1811

然而,你可以在另一台机器上运行Mongo,并让驱动程序连接到,或者如果你真的希望它在你的树莓派上运行,你可以尝试一个非官方的构build

事实上,正如Wilfred Knievel所指出的,MongoDB目前不支持ARM架构。 我已经提供了MongoDB的(非官方的)二进制文件,所以你不需要重新编译它们(因为这是一个相当冗长/棘手的过程)。 这些二进制文件以及一个示例程序(C语言) 可以在这里find

不知道如果你现在我们的meteor万能叉在

https://github.com/4commerce-technologies-AG/meteor

但是我们在那里涉及了一些问题。 还有一些关于纤维和mongo的错误。 请看(closures)问题,并查看bintray上的预build二进制文件

https://bintray.com/4commerce-technologies-ag/meteor-universal/arm-dev-bundles/1.3.3.1/view#files/arm_dev_bundles

你也可以使用节点和mongo tgz来提供服务。

希望能帮助汤姆