0

我有一个从 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);
    }
  });
};

有任何想法吗?

4

1 回答 1

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);
  });
};
于 2013-02-27T14:24:37.070 回答