【发布时间】:2013-12-15 14:27:43
【问题描述】:
我正在使用 Node.js、Express 和 MySql 开发一个 RESTful API。没有使用 ORM。
我想尽可能多地重用代码来处理资源请求。
我要实现一个回调工厂,我想听听你关于我的方法。
api.js
它是主要的应用程序文件。
'use strict';
var
http = require('http'),
express = require('express'),
app = express(),
env = app.get('env'),
config = require('./config')[env],
pool = require('./pool')(config.database), /* node-mysql pool */
people = require('./routes/people')(pool); /* route handlers for people resource */
app.use(express.json());
app.use(express.urlencoded());
app.use(app.router);
app.get('/people', people.findAll); /* middleware handling request for the resource */
http.createServer(app).listen(8000);
路线/people.js
该文件包含处理/peopleresource 请求的代码。
'use strict';
module.exports = {
var
async = require('async'),
CallbackFactory = require('../CallbackFactory'),
people = {};
people.findAll = function (req, res, next) {
async.waterfall(
[
CallbackFactory.createCallback('getPoolConnection', pool),
CallbackFactory.createCallback('lastQuery', 'SELECT * FROM person'),
CallbackFactory.createCallback('json', res)
],
CallbackFactory.getCallback('next', next);
);
};
return people;
};
CallbackFactory.js
模块仅导出createCallback 方法。
createCallback 的第一个参数始终是回调名称。
其他参数特定于要创建的回调。
'use strict';
var
factoryMethods: {
getPoolConnection: function (pool) {
return function (callback) {
pool.getConnection(function (err, connection) {
callback(err, connection);
};
};
},
lastQuery: function (sql, values) {
return function (connection, callback) {
connection.query(sql, values, function (err, result) {
connection.release();
callback(err, result);
});
};
},
json: function (res) {
return function (result, callback) {
res.json(result);
callback();
};
},
next: function (next) {
return function (err) {
if (err) {
return next(err);
}
};
},
};
module.exports = {
createCallback: function () {
var
args = Array.prototype.slice.call(arguments),
name = args.shift();
return factoryMethods[name].apply(null, args);
}
};
结论
我搜索并搜索了 SO,以找到对代码重用有用的方法。
我什么也没找到。也许这不是正确/最好的方法。 你怎么看?
【问题讨论】:
-
我认为这也是个人喜好的问题。我发现很难理解
people.findAll实际做了什么,因为增加了抽象层(尤其是因为你的回调工厂方法非常通用)。我倾向于重用一些代码,如果它使整个代码更容易理解。 -
好主意!实现这个我会头疼 - 我宁愿为此编写一个代码生成器,尽管我讨厌重复的代码。