2016-06-06 10 views
4

Ich habe eine Sammlung mit einem einzigartigen Feld darauf. Lassen Sie uns sagen, dass ich den Wert dieses einzigartigen Feld in der Pre speichern Methode wie folgt erstellen:Node.js Mungo, wie Fehler in der Post zu fangen, speichern

schema.pre('save', function (next) { 
    var _self = this; 
    try { 
     if (config.devMode) { 
      log.debug('[' + si.name + ':write] - Executing presave on: ' + _self._id); 
     } 
     if(!_self.transaction_id){ 
      _self.transaction_id = powm(30).toLowerCase(); 
     } 
     next(); 
    } catch (e) { 
     log.error('[' + si.name + ':write] - threw an error (SAVE): ', e.stack, _self); 
     next(e); 
    } 
}); 

Powm schafft eine aleatorischen String wie ‚dfjkfj3434jkl23k4j2k3j4asdf‘, die eindeutig sein muss. Obwohl der String lang genug ist, um nicht dupliziert zu werden, möchte ich sicher sein, dass ich das Speichern mit einem neuen wiederholen kann, bis ein wirklich einzigartiger Wert darauf steht.

ich MongoDB wissen wirft einen Fehler, der nach oben sprudelt, wenn das Dokument wie folgt zu speichern:

documentname.save(function(err, doc){ 
    // If mongodb unique error then reset with a new id and resave 
}); 

Aber das zwingt mich in den Code für alle Orte zu suchen, wo dies geschieht. Also habe ich mich gefragt, ob ich diesen Fehler in der Post-Mungo-Middleware finden kann. Das Problem ist, dass kein Fehlerobjekt an die post-save-Methode übergeben wird. Also, irgendeine Idee dazu? Vielen Dank!

Antwort

0

Ich antworte mit dem, was ich gerade herausgefunden habe, indem ich auf ein ähnliches Problem gestolpert bin.

Ich konzentriere mich auf den "catch error in post save" -Teil, da ich mir nicht sicher bin, ob das Ändern und erneute Speichern des Dokuments auf diese Weise zu Problemen führen könnte. Ich bin mir nicht sicher, ob das für Ihre speziellen Bedürfnisse gut funktioniert, aber Sie können es versuchen.

Mein Szenario ist ähnlich wie bei Ihnen, aber etwas anders:

  1. ich einen einzigartigen, zufälligen, kurzen Code zu jedem Dokument meiner Sammlung zuordnen möge.
  2. ich erzeugen sie nicht zufällig bei jedem Einfügen, aber ich eine Sammlung von 1M Zufallscodes gespeichert in Dokumenten wie diese vorbestellt generiert:

    { 
        value: "khsda", 
        status: "FREE" 
    } 
    
  3. Jedes Mal, wenn ich ein neues Dokument mit einem einfügen möchten zugehörigen Code, den ich tun, um die Brache:

    1. In .pre('validate',...) ich wählen Sie einen "FREE" Code und setzen Sie den Status auf "PENDING".
    2. Ich weise das neue Dokument code dem value des ausgewählten Codes zu.
    3. Jetzt, wenn der Speichervorgang gut geht, möchte ich den Status zu "TAKEN" ändern, sonst möchte ich den Code frei, setzen Sie seinen Status zurück auf "FREE".
    4. wissen, ob alles in Ordnung ging, habe ich eine .post('save',...) Middleware-Haken, der den Code status-"TAKEN"
    5. Um zu wissen, ändert sich, wenn etwas schief gelaufen ist, habe ich eine .post('validation',...) Middleware Haken. Aber here's the quirk: die Signatur der Funktion, die ich an die Middleware übergeben muss function(error, doc, next) sein. Diese Middleware wird nur dann genannt, wenn ein Fehler im Validierungsprozess auftritt, und lässt mich den status des Codes auf "FREE" zurücksetzen.

Also, im Grunde, könnten Sie eine Middleware wie diese Haken:

schema.post('save', function(err, doc, next) { 
    // Handle the error... 
}); 

Ich bin nicht sicher, ob sich ändern versuchen, und das Dokument an dieser Stelle erneut speichern wird jedes Problem verursachen , aber nach Logik sollte die Speicheroperation bereits abgebrochen worden sein und hier können Sie die Blasenbildung des Fehlers durch die next() steuern. Wenn Sie ein neues Speichern versuchen und dann next() ohne Fehler als Argument aufrufen, funktioniert es möglicherweise wie Sie benötigen.

Lassen Sie mich wissen, ob das funktioniert.