Meine Node.js-Anwendung bietet WebSockets und RESTful Schnittstelle. Ich schrieb einen kleinen Ersatz für Backbone.synch
, um mit Socket.IO als Transport zu verwenden.WebSockets plus RESTful-Schnittstelle, wie schreibt man DRY-Code in Node.js?
TROCKEN Problem: Rückrufe, die auf Client-Ereignis ausgeführt werden, enthält fast dieselbe Logik wie Rückrufe für RESTul-Pfade. Ein Beispiel Mapping zwischen Ereignissen und vom Kunden ausgesandten Daten und die entsprechenden Aktion:
+----------------+---------------------------------+--------------------+
| event emitted | data emitted | RESTful URL |
+----------------+---------------------------------+--------------------+
| read:users | empty string | GET /users |
| read:users | id of the model | GET /users/:id |
| create:users | full model as JSON | POST /users |
| destroy:users | id of the model | DELETE /users/:id |
| update:users | full model as JSON (with id) | PUT /users/:id |
| patch:users | partial model as JSON (with id) | PUT /users/:id |
+----------------+---------------------------------+--------------------+
Beispiel (99% des duplizierten Logik/code):
var UserModel = require('./models/user'); // Mongoose model
// Express path
app.get('/users/:id?', function (req, res)) {
var query = !id ? {} : { _id: id };
UserModel.find(query, function (err, doc) {
return err ? res.send(404, null) : res.send(200, doc);
});
};
// SocketIO listening to the read:users event
socket.on('read:users', function(id, cb) {
var query = !id ? {} : { _id: id }
UserModel.find(query, function (err, doc) {
return err ? cb(err.message, null) : cb(null, doc);
});
});
Da ich spiele mit Knoten. JS und Event-Programmierung (und JavaScript) für ein paar Tage, ich bin auf der Suche nach einem guten Rat, wie ein "Controller", wie ein Allzweck-Objekt, das den duplizierten Code leicht handhaben kann. Vielen Dank.
Während ich Ihre Bemühungen zu schätzen weiß, muss ich sagen, dass ich mit Ihrer Antwort nicht einverstanden bin. Ich weiß, welche Module sind, aber Ihre Lösung verschiebt einfach beide Rückrufe in einem separaten Modul. Etwas zu tun, um sicher zu sein, aber meine Frage war über die Logik der Kombination von ihnen (mit Problemen im Zusammenhang mit Parametern). Trotzdem danke! – Polmonino
Ich habe meine Antwort aktualisiert, um zu zeigen, dass es mit Ihrer aktuellen Einrichtung keine Möglichkeit gibt, das Problem der logischen Duplizierung zu umgehen. Wenn Sie jedoch Ihren Clientcode angepasst haben, der das Socket-Ereignis ausgibt, um ein Objekt mit ähnlichen Funktionen/Eigenschaften an das Objekt app.get() zu übergeben (Request- und Response-Objekte), können Sie die Codewiederholung reduzieren. Meiner Meinung nach ist dies jedoch eine schlechte Übung, da Sie die Funktionen, die Sie mit dieser Funktion ausführen können, wirklich einschränken (ohne komplexeren Code hinzuzufügen, der für Ihre clientseitigen Socket-Informationen sichtbar ist). – Default