如何设计我的Node.js API,以便我也可以从服务器端使用它?

时间:2013-02-27 07:37:06

标签: api node.js mongodb express api-design

我有一个从mongodb返回一些JSON的API:

// In router.js
var api = require('api') 
app.get('/lists', api.lists);

// In api.js
var db = require('db')
exports.lists = function(req, res) {
  db.lists.find({}, function(err, lists) {
    res.send(lists);
  });
};

有没有办法设计API,以便我也可以从我的Node.js应用程序中使用它?我试图避免重复API之外的任何数据库代码。我基本上有一个可以渲染数据服务器端的控制器:

// In controller.js
var api = require('api')
exports.page = function(req, res) {
  res.send(api.lists()); // This won't work
};

我发现了一个hacky解决方案,它将回调函数传递给api.lists(),但我感觉这是实现这个目的的“错误”方法:

// In api.js
exports.lists = function(req, res, callback) {
  db.lists.find({}, function(err, lists) {
    if(callback){
       callback(lists);
    } else {
       res.send(lists);
    }
  });
};

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为问题在于,在当前的代码中,您将API与响应对象耦合。你可以用这样的东西来解耦它们:

在router.js 中,而不是使用api.lists作为回调,定义一个函数,该函数将使用连接到响应对象的回调调用api.lists。在这种情况下,api.list不需要知道响应对象,而是我们正在创建的函数。

// In router.js
var api = require('api');
app.get('/lists', function(req, res) {
  api.lists(function(err, lists) {
    if(err) {
      res.send('error page');
      return;
    }
    res.send(lists);
  });
});

在api.js 中,我们删除了对响应对象的引用。现在它只会使用适当的数据(错误+列表)调用它收到的任何回调。这取决于对结果做任何喜欢的事情。

// In api.js
var db = require('db')
exports.lists = function(callback) {
  db.lists.find({}, function(err, lists) {
    callback(err, lists);
  });
};