私のNode.jsアプリケーションは、WebSocketとRESTfulインターフェースの両方を提供します。Backbone.synch
Socket.IOをトランスポートとして使用するための小さな代替品を作成しました。
DRYの問題:クライアントイベントで実行されるコールバックには、RESTulパスのコールバックとほぼ同じロジックが含まれています。クライアントによって発行されたイベントとデータ間のマッピングの例、および対応するアクション:
+----------------+---------------------------------+--------------------+
| 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 |
+----------------+---------------------------------+--------------------+
例(重複したロジック/コードの99%):
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);
});
});
私はNode.JSとイベントプログラミング(およびJavaScript)で数日間遊んでいるので、複製されたコードを簡単に処理できる汎用オブジェクトのような「コントローラー」を設計する方法についての良いアドバイスを探しています。ありがとう。