如何设计Node.js API,以便也可以从服务器端使用它?
我有一个从mongodb返回一些JSON的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); }); }; 有没有办
// 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调用自动创建方法/属性。如果是这样的话,祝你好运,已经有几次尝试将其标准化,但到目前为止还没有任何进展。