2012-04-26 28 views
0

目前,这是一个令人沮丧的问题。流星HTTP GET在Mongo循环内部崩溃

我能够做一个Meteor.http.get调用,但是当我把它放在一个循环中时,会发生不好的事情。

我不是100%确定我在做什么,所以任何指针都会很棒!

此代码的工作 - 这是CoffeeScript的

此代码崩溃:

things.forEach((thing) -> 
    console.log thing.url # it logs http://some_site.com/feed.rss 
    Meteor.http.get(thing.url, (error, results) -> 
    if results.statusCode is 200 
     console.log results.content 
) 
)) 

有了这个错误:

退出,代码为
node.js:201 
    throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: Cannot read property '_meteor_dynamics' of undefined 
at Object.bindEnvironment (app/packages/meteor/dynamics_nodejs.js:48:44) 
at Object.call (app/packages/http/httpcall_server.js:72:25) 
at Object.get (app/packages/http/httpcall_common.js:40:29) 
at app/craftcandy.coffee.js:112:28 
at app/packages/mongo-livedata/mongo_driver.js:307:7 
at /usr/local/meteor/lib/node_modules/mongodb/lib/mongodb/cursor.js:173:11 
at [object Object].nextObject (/usr/local/meteor/lib/node_modules/mongodb/lib/mongodb/cursor.js:485:5) 
at Object.callback (/usr/local/meteor/lib/node_modules/mongodb/lib/mongodb/cursor.js:478:12) 
at Array.0 (/usr/local/meteor/lib/node_modules/mongodb/lib/mongodb/connection/server.js:197:36) 
at EventEmitter._tickCallback (node.js:192:41) 

:1个 您的应用程序崩溃。等待文件更改。

+0

这是流星的'Cursor.prototype.forEach'的错误,现在固定在0.3.4。您的帖子发现了它,谢谢。 – debergalis 2012-04-28 19:21:56

回答

0

我认为这可能是因为meteor使用了node.js,而node.js是异步和非阻塞的。

所以,不是检查的results.statusCode,也许把在回调(原谅我的CoffeeScript):

things.forEach((thing) -> 
    console.log thing.url # it logs http://some_site.com/feed.rss 
    Meteor.http.get(thing.url, (error, results) -> 
     results.on('data', (d) -> 
     //Do something here with the data stream 
    ) 

     results.on('end', (rslts) -> 
     //Do something here with the results stream, like log to console: 
     console.log rslts.content 
    ) 
    ) 
) 

对不起提前如果脚本语法是错误的。正如我所说,我不会说咖啡标记(还)。

但你明白了。我从node.js question分解了这个。让我知道它是否有效。

0

我会怀疑你的代码有问题,我没有看到,或者你的一个URL是错误格式的。你可以尝试这样的测试它:

Things.find().forEach(function(thing){ 
    var url = thing.url; 
    console.log("geting " + url); 
    (function (_url){ 
    try{ 
     Meteor.http.get(_url, function(error, results){ 
     if(results.statusCode === 200){ 
      console.log("request success: " + _url); 
     } else { 
      console.log("request error: " + _url); 
     } 
     }); 
    } catch (e) { 
     // if it gets here you probly have a malformed url 
     console.log("meteor error!: "+_url); 
    } 
    })(url); 
}); 

这里是我的未经测试在翻译了试图coffeestript:

Things.find().forEach (thing) -> 
    url = thing.url 
    console.log "geting: " + url 
    go = (_url) -> 
    try 
     Meteor.http.get _url, (error, results) -> 
     if results.statusCode is 200 
      console.log "request success: " + _url 
     else 
      console.log "request error: " + _url 

    catch e 
     # if it gets here you probly have a malformed url 
     console.log "meteor error!: "+ _url 

    go url