Node.jsasynchronouscallback工厂

我正在用Node.js,Express和MySql开发一个RESTful API 。 没有使用ORM。

为了处理资源请求,我想尽可能地重用代码。

我要实现一个callback工厂 ,我想听取您的意见。

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

这是包含处理/people资源请求的代码的文件。

 '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的第一个参数始终是callback名称。
其他参数是特定于要创build的callback。

 '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); } }; 

结论

我GOOGLE和searchSO以find有用的代码重用的方法。
我没有find任何东西。 也许这不是正确的/最好的方法。 你怎么看待这件事?

我想你在这里错了。 callback工厂不是一个常见的模式,因为它增加了一个抽象层,不以任何方式降低复杂性。 换句话说,把async.waterfall想象成已经提供了你正在寻找的抽象层。 或者,如果您喜欢命名的函数,那么我build议使用async.auto ,它还会根据您指定的依赖关系自动确定哪些函数可以串行和并行方式操作。

我会build议让async.waterfall或async.auto直接调用你的函数。 如果你想要更多的抽象和更less的代码,使用像Sequelize这样的ORM。 但是我发现你的工厂很难理解你的代码,以后再来的其他人。