2014-04-19 8 views
8

Ich mache zum ersten Mal eine ziemlich einfache Meteor-App, die alle Git-Probleme von einem bestimmten Repo abfragen soll. Nachdem es eine Liste von Problemen aus der Github API erhalten hat, besteht die Idee darin, eine Sammlung von Aufgaben aus diesen Problemen zu erstellen. Jedes Mal, wenn ich versuche, die Liste der aktuellen Aufgaben zur Abfrage erhalte ich:Das Holen von Gegenständen aus einer Meteor-Sammlung auf dem Server wirft "Kann nicht ohne Faser warten"

.../.meteor/tools/c2a0453c51/lib/node_modules/fibers/future.js:83 
W20140418-17:00:43.872(-7)? (STDERR)  throw new Error('Can\'t wait without a fiber'); 
W20140418-17:00:43.872(-7)? (STDERR)   ^
W20140418-17:00:43.889(-7)? (STDERR) Error: Can't wait without a fiber 
W20140418-17:00:43.889(-7)? (STDERR)  at Function.wait  
(.../.meteor/tools/c2a0453c51/lib/node_modules/fibers/future.js:83:9) 
W20140418-17:00:43.890(-7)? (STDERR)  at Object.Future.wait  
(.../.meteor/tools/c2a0453c51/lib/node_modules/fibers/future.js:325:10) 
W20140418-17:00:43.890(-7)? (STDERR)  at _.extend._nextObject (packages/mongo-  
livedata/mongo_driver.js:805) 
W20140418-17:00:43.890(-7)? (STDERR)  at _.extend.forEach (packages/mongo-livedata/mongo_driver.js:836) 
W20140418-17:00:43.890(-7)? (STDERR)  at Cursor.(anonymous function) [as forEach] (packages/mongo- 
livedata/mongo_driver.js:695) 
W20140418-17:00:43.890(-7)? (STDERR)  at app/server/publish.js:51:33 
W20140418-17:00:43.890(-7)? (STDERR)  at Array.forEach (native) 
W20140418-17:00:43.891(-7)? (STDERR)  at app/server/publish.js:49:19 
W20140418-17:00:43.891(-7)? (STDERR)  at 
...packages/npm/.build/npm/node_modules/github/api/v3.0.0/issues.js:116:17 
W20140418-17:00:43.891(-7)? (STDERR)  at IncomingMessage.<anonymous> 
(...packages/npm/.build/npm/node_modules/github/index.js:756:21) 

Mein erster Gedanke war, dass ich einen Rückruf irgendwo wurde mit, wenn ich angeblich eine Knoten-Faser zu verwenden, aber der Code scheint relativ einfach:

var repos = ['my-repo', 'my-repo-1',]; 
var pollGit = function() { 

repos.forEach(function(repo) { 
    github.issues.repoIssues({ 
     user: 'user', 
     repo: repo 
    }, function(err, stuff) { 
     if (err) { 
      throw err; 
     } 
     stuff.forEach(function (issue) { 
      var sel = {git_id: issue.id}; 
      Tasks.find(sel).forEach(function (item) { //ERROR THROWN HERE 
       console.log('got', item); 
      }); 
     }); 
    }); 
}); 
}; 

Meteor.startup(function() { 
    pollGit(); 
}); 

Dieser Fehler tritt auf, immer wenn ich versuche, das tatsächliche Objekt nach dem Auffinden zu holen. Nur find() funktioniert gut. Was genau verursacht den Fehler?

Antwort

12

meine eigene Frage, falls jemand beantworten muss die Antwort:

Verstanden mit How to insert in Collection within a Fiber?

-Code arbeitet wie folgt:

Fiber = Npm.require('fibers'); 
var repos = ['my-repo', 'my-repo-1',]; 
var pollGit = function() { 
repos.forEach(function(repo) { 
    github.issues.repoIssues({ 
     user: 'user', 
     repo: repo 
    }, function(err, stuff) { 
     if (err) { 
      throw err; 
     } 
     stuff.forEach(function (issue) { 
      var sel = {git_id: issue.id}; 
      Fiber(function() { 
       Tasks.find(sel).forEach(function (item) { //ERROR THROWN HERE 
        console.log('got', item); 
       }); 
      }).run(); 

     }); 
    }); 
}); 
}; 

Meteor.startup(function() { 
    pollGit(); 
}); 
+2

sehen diese Antwort: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert- auf-s/18541825 # 18541825 – imslavko

0

Wie @imslavko wies darauf hin, die richtige Art und Weise zu warten auf Mongo-Ergebnisse in einem Callback zu verwenden ist Meteor.bindEnvironment (die übrigens ein Beispiel mit der GitHub-API hat). In Ihrem Fall

github.issues.repoIssues({ 
     user: 'user', 
     repo: repo 
    }, Meteor.bindEnvironment(function(err, stuff) { 
     ... 
    }, function() { console.log('Failed to bind environment'); }) 
);