Node.js 异步回调工厂

标签 node.js api rest express

我正在使用 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

它是包含处理 /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 的第一个参数始终是回调名称。
其他参数特定于要创建的回调。

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

结论

我在谷歌上进行了搜索,以便找到对代码重用有用的方法。
我什么也没找到。也许这不是正确/最好的方法。 你对此有何看法?

最佳答案

我认为你走错了路。回调工厂不是一种常见的模式,因为它添加了一个抽象层,但没有以任何方式降低复杂性。换句话说,将 async.waterfall 视为已经提供了您正在寻找的抽象层。或者,如果您喜欢命名函数,我推荐 async.auto ,它还会根据您指定的依赖关系自动确定哪些函数可以串行和并行操作。

我建议让 async.waterfall 或 async.auto 直接调用您的函数。如果您想要额外的抽象和更少的代码,请使用像 Sequelize 这样的 ORM。但我发现你的工厂让后来的其他人理解你的代码变得复杂。

关于Node.js 异步回调工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284952/

相关文章:

javascript - Webdriverio cucumber 不能使用 promise

api - OSX API 问题 : Where does BlockZero live?

c++ Mysql C API 连接问题

web-services - SOAP UI/SOAP UI PRO 中的 Content-Type application/soap+msbin1

api - HTTP PUT 和 DELETE 的幂等性

java - 从 Response 实体获取对象的值

node.js - IE8 和 9 上的 socket.io 问题

node.js - mongoDB 中的数组更新

node.js - 从 cron 作业调用时,nodejs setTimeout 不起作用

剩下的交给 Azure SQL 数据库集成服务