WebSockets加RESTful接口,如何在Node.js中编写DRY代码?

Pol*_*ino 5 dry node.js express socket.io

My Node.js应用程序提供WebSockets和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    |
+----------------+---------------------------------+--------------------+
Run Code Online (Sandbox Code Playgroud)

示例(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);
    });
});
Run Code Online (Sandbox Code Playgroud)

因为我正在使用Node.JS和事件编程(和JavaScript)几天,所以我正在寻找一个关于如何设计"控制器"的好建议,就像一个可以轻松处理重复代码的通用对象.谢谢.