2016-03-27 4 views
1

Ich verwende NodeJS und Mongoose für eine Anwendung, die Benutzer hat. Und ich habe eine große Anzahl von Aktionen, die der Server für einen bestimmten Benutzer ausführt, abhängig von der Anfrage.Wie kann ich diese Code-Duplizierung reduzieren in NodeJS/Mongoose

Das heißt, ich habe dieses bestimmtes Codefragment in einer Vielzahl von Funktionen mit:

User.findOne({'email':req.user.email}, function (err, user) { 
if (err) { 
    console.log('err'); 
    res.send('Error'); 
} 
if(!user){ 
    console.log('err'); 
    res.send('Error'); 
} 

// do something with returned user 
user.data = .... 
... 

user.save(function(err) { 
    if(err) { 
    console.log('err'); 
    res.send('Error'); 
} 
else { 
    console.log('success'); 
    res.send('Success'); 
} 

}

Wie Sie sehen können, gibt es eine Menge Code, repliziert. Der Code, der sich ändert, ist der Teil "tue etwas mit zurückgegebenem Benutzer". Fast alles andere (Fehlermeldungen usw.) bleibt gleich.

Also, wie kann ich diesen Teil extrahieren? Da dies mit dem Callback-Mechanismus funktioniert, gibt es einen bestimmten Weg, dies zu erreichen?

+5

Verwenden Sie ['.update()'] (http://mongoosejs.com/docs/api.html#model_Model.update) anstelle von Startern. '.findOne()' zu verwenden, dann '.save()' zu manipulieren und aufzurufen, ist eine ziemlich schlechte Übung, die Bandbreite zu kauen, die Dinge langsam und generell voller Löcher zu machen, die zu Problemen mit den Nebenläufigkeiten bei Updates führen. Es ist ein breiteres Problem, aber nur herauszufinden, wie man diesen einen Anruf richtig anwendet, spart eine Menge Standard und bietet Ihnen viele weitere Vorteile. –

Antwort

1

Ein Weg ist, Promises zu verwenden. Es würde beinhalten, einen Weg zu finden, um die Mongooose API zu konvertieren, um Promises zurückzugeben, anstatt Callbacks zu verwenden. Danach könnten Sie Code erstellen, die die Linien von

User.findOne(...) 
    .then((user) => { 

     // do something with the returned user 

     return user.save(); 
    }).then(() => { 
     console.log('success'); 
     res.send('Success'); 
    }).catch(() => { 
     console.log('err'); 
     res.send('Error'); 
    }); 

Promises ähneln traditionelle synchrone Codierung, wo man Fehler folgen würden ähnlich try-catch-Block und somit benötigt nur eine Fehlerbehandlung Standort ausbreiten kann. Auf diese Weise müssten Sie die console.log('err'); res.send('Error'); Zeilen nicht an mehreren Stellen replizieren.

Sie können eine Einführung in Promises zum Beispiel in "Promises - A Gentle Introduction" lesen. Für den Teil, der Mongoose in Promises umwandelt, kann es ein existierendes Modul dafür geben, oder ein anderer Ansatz, den APIs verwenden, ist, Callback-Funktion nicht als das letzte Argument zu geben, und dann wird stattdessen ein Promise zurückgegeben. Leider habe ich kein genaues Wissen in dieser speziellen Mongoose API.