2014-04-19 7 views
8

Sto creando per la prima volta un'app meteorica abbastanza semplice che dovrebbe interrogare tutti i problemi di git da un determinato repository. Dopo aver ottenuto un elenco di problemi da github api, l'idea è di creare una raccolta di attività da questi problemi. Tuttavia, ogni volta che provo per interrogare l'elenco dei compiti attuali ottengo:Il recupero di elementi da una raccolta di Meteor sul server genera "Non vedo l'ora senza fibra"

.../.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) 

Il mio primo pensiero è stato che stavo usando una richiamata da qualche parte, quando avrei dovuto essere con un nodo in fibra, ma il codice sembra relativamente semplice:

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(); 
}); 

Questo errore si verifica ogni volta che provo a prenderlo l'oggetto vero e proprio dopo aver chiamato ritrovamento. Basta chiamare find() funziona bene. Che cosa sta causando esattamente l'errore?

risposta

12

Rispondendo alla mia domanda proprio nel caso in cui qualcuno ha bisogno la risposta:

ottenuto che funziona con How to insert in Collection within a Fiber?

codice è il seguente:

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

vedere questa risposta: http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert- on-s/18541825 # 18541825 – imslavko

0

Come @imslavko sottolineato, il modo corretto di attendere i risultati di Mongo in un callback è utilizzare Meteor.bindEnvironment (che per inciso ha un esempio che utilizza l'API GitHub). Nel tuo caso,

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