2017-08-24 2 views
1

Ich habe an einer Anwendung gearbeitet, die es mir ermöglicht, Unternehmen zu einer Datenbank hinzuzufügen. Ursprünglich war mein Code reiner Spaghetti, also wollte ich ihn richtig modularisieren. Zu diesem Zweck habe ich Routen, einen Controller und einen Dao hinzugefügt.Probleme mit Rückrufen, Fehler und MongoDB

Dies ist, wie mein Code jetzt

Routen

app.post('/loadcompanies', (req, res)=> { 
    companiesController.loadcompany(req.body, (results)=>{ 
     console.log(results); 
     res.send(200, "working!"); 
    }) 
    }) 

-Controller

module.exports.loadCompany = (body, callback)=>{ 
    companiesDao.loadCompany(body, callback); 
} 

Dao

module.exports.loadCompany = (company, callback)=>{ 
MongoClient.connect(conexionString, (err, database) => { 
    if (err) console.log(err); 
    db = database; 
    console.log(company); 
    db.collection('companies').insert(company, (err, result)=>{ 
     callback({message:"Succesfully loaded company", company:result});  
    }); 
    }) 
} 
sieht

Meine aktuelle Sorge ist, dass das Arbeiten mit Fehlern beim Modularisieren so verwirrend ist. Ich habe versucht, eine try-catch-Methode um die db einfügen und werfen und Fehler, wenn es eine, aber das scheint nicht zu funktionieren. Andere Dinge, die ich versucht habe, um den Fehler in der Callback-Rückkehr, wie folgt aus:

if (err) callback (err, null); 

aber ich am Ende immer ein „Satz kann nicht Header, nachdem sie gesendet werden.“ Error.

Wie würden Sie in dieser Situation mit Fehlern umgehen? Zum Beispiel für den Fall, dass jemand versucht, einen doppelten Eintrag in einem eindeutigen Element hinzuzufügen.

+0

Rückrufe und Fehlerprüfung immer schwierig gewesen, würde ich Ich schlage vor, Sie schauen in die Verwendung von Versprechen, und dann in async/erwarten, um die Dinge noch besser zu machen. – Keith

+0

Als Addendum, in meiner ursprünglichen Spaghetti-Anwendung hatte ich es nur Res 503 senden, wenn der Mongodb hatte einen Fehler, und das war, dass – xai2

+0

Ich sehe Versprechen und async erwarten sicher, da Rückrufe können wirklich verwirrend sein haha , aber die Beispiele für diese Fälle scheinen hauptsächlich Callbacks zu sein. Danke! – xai2

Antwort

1

sollten Sie in der Lage sein, einfach in der Callback-Überprüfung für die Insert-Funktion der Fehler machen:

db.collection('companies').insert(company, (err, result)=>{ 
    if (err) { 
     callback(err, null); 
     return; 
    } 
    callback(null, {message:"Succesfully loaded company", company:result});  
}); 

Wenn Sie eine Fehlermeldung erhalten, wie Sie sagen, das ist wahrscheinlich, weil die Datenbank tatsächlich einen Fehler zurückgegeben. Sie könnten auch Ihre Fehler spezifischer machen, wie zum Beispiel:

+0

Nur eine Anmerkung, Sie tun entweder 'if (err) {} else {},' oder tun Sie 'if (err) return callback() 'weil was in diesem Code passieren wird, wird der Fehler Callback und dann auch den erfolgreichen Rückruf. – Keith

+0

@Keith Natürlich, dummer Fehler. Danke –

+0

Kein Problem, einfach zu tun. Eine andere Sache, die ich gesehen habe, für Ihren Erfolg Callbacks nicht vergessen, Callback (null, Ergebnis) '.. Es sind diese Dinge, die mich sofort in Versprechen verwandeln, wenn ich diese sehe, und dann Async/erwarten. Wenn ich sage, dass sogar async/await verwendet wird, kann ich manchmal die Wartezeit vergessen. – Keith

0

Hier ist Ihre loadCompany in async/erwarten Format.

Notice es gibt keine Notwendigkeit für die Fehlerprüfung, Fehler werden wie erwartet die Versprechen-Kette propagieren.

Hinweis habe ich auch geändert loadCompany eine Asynchron-Funktion zu sein, so dass es zu nennen, können Sie einfach tun var ret = await loadCompany(conpanyInfo)

module.exports.loadCompany = async (company)=>{ 
 
    let db = await MongoClient.connect(conexionString); 
 
    console.log(company); 
 
    let result = await db.collection('companies').insert(company); 
 
    return {message:"Succesfully loaded company", company:result};  
 
}

+0

vielen dank :) ich habe gelesen auf die vorteile von versprechen und ich werde absolut beginnen sie in meinem code zu verwenden. der Aufruf zu dieser Methode müsste durch ein Versprechen mit warten müssen, nicht wahr? von der Steuerung und den Routen – xai2