2016-07-20 3 views
1

My Meteor 1.2.1 Programm warf MongoError: cursor killed or timed out in einer find().forEach() Schleife, so fand ich this page, dass dieser Code sagt verhindert, dass:MongoError: Cursor getötet oder Zeitüberschreitung - Meteor Timeout-Einstellungen unwirksam

var myCursor = db.users.find().noCursorTimeout() 

jedoch die driver docs und mein Meteor sagen, dass Methode existiert nicht: Object [object Object] has no method 'noCursorTimeout'

Mongo autoReconnect enabled by default ist und hat nicht geholfen, noch die Meteor forum oder sogar .find({}, {timeout:false}) nach this comment.

2016-07-20 11:21:37-Update gestartet

2016-07-20 11:37:21 Ausnahme beim Aufruf der Methode 'updateCollections' MongoError: Cursor getötet oder Zeitüberschreitung

Vielleicht Meteor wurde durch den fehlgeschlagenen SOAP-Aufruf am 2016-07-20 09:34:57 verwirrt?

"error": { 
    "errno": "ETIMEDOUT", 
    "syscall": "connect", 
    "code": "ETIMEDOUT" 
    }, 
+0

Glauben Sie, dass 'maxTimeMS' Methode des Cursor-Objekts helfen würde? Hast du es versucht? –

+0

'cursor.maxTimeMS (5000)' resultiert in 'Objekt [Objekt Objekt] hat keine Methode 'maxTimeMS''. MongoDB Server 3.2 unter Windows 10 versteht es, Meteor 1.2.1 jedoch nicht. Versions-Datei sagt [email protected], also werde ich versuchen, das zu aktualisieren. –

+0

Wenn Sie das Mongo-Paket erneut hinzufügen, bleibt die Meteor-Version [email protected] –

Antwort

1

maxTimeMS Unter der Annahme, würde in diesem Fall helfen, es durch die Arbeit mit rawCollection Objekt anstelle der Sammlung Meteor zugreifen kann sich.

Es ist ganz einfach:

var rawCollection = Meteor.users.rawCollection(); 
var cursor = rawCollection.find({}).maxTimeMS(5000); 
var myData = fetchCursor(cursor); 

Wo fetchCursor ist eine einfache Faser-aware Helferfunktion, die wie folgt durchgeführt werden können:

var fetchCursor = Meteor.wrapAsync(function fetchCursor (cursor, cb) { 
    cursor.toArray(cb); 
}); 

Obwohl, ich bin nicht sicher, ob diese Methode ist genau das, Nach was suchst du.

bearbeiten

Wenn Sie nicht das gesamte Array von Dokumenten benötigen, aber Sie wollen jeden einzelnen von ihnen verarbeiten unabhängig kann es besser sein each zu verwenden anstelle von toArray, z.B.

var fetchCursor = Meteor.wrapAsync(function fetchCursor (cursor, cb) { 
    cursor.each(function (err, doc) { 
    if (err) return cb(err); 
    if (!doc) return cb(null, { done: true }); // no more documents 
    // do something with the document ... 
    }); 
}); 
+0

Wird das nicht speicherlastig sein? Wie mache ich einen 'cursor.forEach' damit? –

+0

'myData.forEach()' funktioniert, da es nur kleine Wörterbücher enthält. –

+0

Oder nicht: 'FATAL FEHLER: Evakuierungszuweisung fehlgeschlagen - Prozess nicht genügend Speicher '@' AppData \ Lokale \ .meteor \ packages \ Meteor-tool \ 1.1.10 \ mt-os.windows.x86_32 \ tools \ utils \ fiber- helpers.js: 168'. Aber bis zu diesem Zeitpunkt gibt es kein Timeout. –