Beste Weg, um OOP im Express-REST-API?
Werde ich alle und mache ein Projekt mit nur Knoten. Es war eine Menge Spaß, aber manchmal bekomme ich ein wenig in ihn verloren und ich will versuchen, Verständnis zu erlangen, wie ich verwirrt, also Baue ich es korrekt und nicht zu sehr überfordert. Wie auch immer, hier ist das problem:
Habe ich REST-API, die mithilfe von Express und mysql. Ich richte mysql:
app.js
//Variables, move these to env
var dbOptions = {
host: config.db_config.host,
user: config.db_config.user,
password: config.db_config.password,
port: config.db_config.port,
database: config.db_config.database
};
app.use(myConnection(mysql, dbOptions, 'single'));
und dann habe ich auch meine Routen, vorbei an den Routen der app und log-middleware, so kann ich Sie in der route:
app.js Forts.
var userRoute = require('./routes/users.js')(app,log);
app.use('/users', userRoute);
Dass war eigentlich ein wenig verwirrend, aber jetzt verstehe ich es, ich haben, Sie zu übergeben in Modul damit Sie das Modul, um die Daten abzurufen.
Dann im meine route-Datei, die ich möchte, ein Objekt zu verwenden, so dass ich verwenden können, die gleiche Funktionalität für andere Strecken, aber in der user-Datei um die gleiche connection pool, die alles andere, oder zumindest nicht erneut, die Verbindung herzustellen muss ich übergeben Sie es der Antwort und Anfrage? Es muss einen besseren Weg, das zu tun. Es ist wirklich unschön, die Art und Weise. Hier ist der relevante Teil
routes/users.js
var User = require('../controllers/User.js');
module.exports = (function(app,log) {
var userR = express.Router();
userR.post('/register', function(req,res){
var email = req.body.email;
var password = req.body.password;
var firstName = req.body.first_name;
var lastName = req.body.last_name;
var userId;
try {
var query;
var status = 200;
var response = '';
var newUser = {
email: email,
password:password,
first_name: firstName,
last_name: lastName,
password: password
};
var user = new User(req,res);
user.register(newUser);
...
};
controllers/User.js
module.exports = function User(req,res) {
this.id = 0;
this.register = function(newUser){
var _this = this;
var deferred = q.defer();
req.getConnection(function(err,connection){
...
Muss es ein Muster sein, ich bin hier fehlen. Ich sollte nur in der Lage sein, um übergeben Sie die app oder sowas und haben Zugriff auf die erf.getConnection etc.
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist irgendwie viel Los hier, aber ich werde einen Riss auf diese ein.
Meine erste Empfehlung wäre, zu versuchen zu halten Ihre Router ziemlich schlank. Es ist nicht beschriftet, aber ich gehe davon aus, dass der größte code-snippet Sie bereitgestellt haben, ist dein router. Es gibt viele Meinungen natürlich, aber wenn ich Taten dies hier ist, was mein router Aussehen würde. Ich nehme an, Sie sind mit Express 4x.
routes/users.js
Also, was wir hier getan haben, eliminiert und die Abhängigkeit Ihrer app/log middleware.
Dies bedeutet, dass Ihre Datei (was ich in der Regel rufen app.js), wird wie folgt Aussehen:
app.js
Dies ist auch, wo Sie können jede Art von middleware, die Sie wählten (logging -, Körper-Analyse, Fehler-handling, etc).
In den neueren Versionen von Express-der obige code tatsächlich mounts unsere userRouter zu "/Benutzer". In diesem Fall wird Ihnen jetzt noch ein "/user/register" route".
So, jetzt da wir gezogen haben, einige der Logik der router, wir haben das irgendwo. In der Regel ein router sprechen mit einem controller so lassen Sie uns nehmen einen Blick:
controllers/user.js
Das erste, was Sie bemerken werden, ist, dass ich ein UserModel-Datei. Dadurch haben wir die de-coupled unsere Modell-Objekt von dieser route. Lassen Sie uns sagen, zum Beispiel haben wir ein neues register route (vielleicht hat einer von Ihnen eine E-Mail + pw, die anderen Register durch FB und wir haben zum speichern verschiedener Dinge). Wir sollten in der Lage sein, die gleiche Funktion (user.registrieren Sie in diesem Fall) angegeben, die in unserem Modell zimmerreserviereung, ohne das Sie ändern eine ganze Reihe von Dingen!
Nun, hier ist, was ein UserModel Aussehen könnte:
/models/user.js
Nun haben wir endlich bekommen, um den Kern Ihrer Frage. An der Spitze, werden Sie sehen, haben wir eine Verbindung Datei. Dies ist, wo wir alle unsere DB-bezogene Logik, wie unsere Verbindung pools.
/lib/connection.js
So, zum Schluss, statt der übergabe Ihrer Verbindung gemeinsam mit Ihrer request-Objekt, das wir jetzt einfach unsere kurze Verbindung Modul-egal in welchem Modell-Datei, die wir in sind, bitten für eine Verbindung, und alles tun, was die Verarbeitung müssen wir. Beachten Sie auch, haben Sie zum lösen der verbindungen wieder in den pool, aber das überlasse ich Ihnen als übung für Euch :).
Außerdem Schreibe ich normalerweise CoffeeScript, also bitte entschuldigt eventuelle kleine Fehler. Lassen Sie mich wissen, wenn Sie haben die Notwendigkeit für weitere Abklärungen.
Cheers,
Brennan
myConnection
bit. Ich habe noch nie gesehen, dass vor. Es macht mehr Sinn für mich, es zu tun auf diese Weise, weil nicht jede Anfrage müssen Sie eine Verbindung zu der Datenbank. Ich finde, dass der Export alles am Boden Reiniger ist für die beiden Grund. Erste, Sie können halten Sie Ihre code zu schmeicheln, anstatt sofort angefangen eine Ebene tief. Zweitens, angenommen, Sie sind konsequent, werden Sie wissen, wo zu schauen, dass alle Ihre Dateien für die Exporte. Wäre dies nicht der Fall sein, wenn Sie die Schritte zum hinzufügen von helper-Methoden, die Sie nicht exportieren wollen, um Sie mit den anderen Weg.