Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设计Node.js API,以便也可以从服务器端使用它?_Api_Node.js_Mongodb_Express_Api Design - Fatal编程技术网

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

如何设计Node.js API,以便也可以从服务器端使用它?,api,node.js,mongodb,express,api-design,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); }); }; 有没有办

我有一个从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
};
我找到了一个黑客解决方案,将回调函数传递给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);
    }
  });
};

有什么想法吗?

我认为问题在于,在您当前的代码中,您将API耦合到响应对象。您可以通过以下方式将它们解耦:

在router.js中不使用api.list作为回调,而是定义一个函数,该函数将使用连接到响应对象的回调调用api.list。在本例中,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中,我们删除了对响应对象的引用。现在,它将只调用它接收到的任何回调,并使用适当的数据(err+列表)。这取决于回调函数如何处理结果

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

我认为问题在于,在您当前的代码中,您正在将API耦合到响应对象。您可以通过以下方式将它们解耦:

在router.js中不使用api.list作为回调,而是定义一个函数,该函数将使用连接到响应对象的回调调用api.list。在本例中,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中,我们删除了对响应对象的引用。现在,它将只调用它接收到的任何回调,并使用适当的数据(err+列表)。这取决于回调函数如何处理结果

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

您想使用自己的api吗?以前从没听说过这个。也许您想使用可以在两个不同地方使用的模型…查看express。这听起来很像wsdl/webservice发现,即能够根据您公开的api调用自动创建方法/属性。如果是这样的话,祝你好运,已经有几次尝试将其标准化。到目前为止,还没有什么进展。你想使用自己的api吗?以前从没听说过这个。也许您想使用可以在两个不同地方使用的模型…查看express。这听起来很像wsdl/webservice发现,即能够根据您公开的api调用自动创建方法/属性。如果是这样的话,祝你好运,已经有几次尝试将其标准化,但到目前为止还没有任何进展。