我在server.js中定义了以下快速路由:
app.get('/adfeed', adfeed.findAll);
app.get('/subscriptions', subscriptions.findAll);
app.get('/cronjob/match', cronjob.match);
在/ adfeed上执行GET时调用的函数是:
exports.findAll = function(req, res) {
mongo.Db.connect(mongoUri, function (err, db) {
db.collection('adfeed', function(er, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
db.close();
});
});
});
}
执行GET on / subscriptions时调用的函数是:
exports.findAll = function(req, res) {
console.log("Get All Subscriptions");
mongo.Db.connect(mongoUri, function (err, db) {
db.collection('subscriptions', function(err, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
db.close();
});
});
});
}
问题:/ cronjob / match需要同时使用上述功能。从Express路线拨打Express路线是最佳做法吗?是否有更好的方法可以在不重复代码的情况下执行此操作?
感谢您的帮助!
答案 0 :(得分:0)
您可以使用生成所需功能的函数来避免代码重复,这比听起来更容易:
function findStuffFn(typeOfStuff) {
return function (err, db) {
db.collection(typeOfStuff, function(err, collection) {
collection.find().toArray(function(err, items) {
res.send(items);
db.close();
});
});
};
}
这将返回一个与上面的代码类似的函数,但是使用参数替换字符串。因此,您的代码可能如下所示:
exports.findAll = function(req, res) {
mongo.Db.connect(mongoUri, findStuffFn('adfeed'));
};
和
exports.findAll = function(req, res) {
console.log("Get All Subscriptions");
mongo.Db.connect(mongoUri, findStuffFn('subscriptions'));
};
答案 1 :(得分:0)
这就是分离关注点的想法发挥作用的地方。在这种情况下,您需要一个单独的nodejs模块来进行数据库调用。该模块公开了两种方法。
/ adfeed调用函数A. / subscriptions调用函数B. 而且,/ cronjob调用这两个函数。
通过使用SoC,您可以增加代码的重用。您的控制器方法不直接调用db代码。他们只负责一件事。