[英]Express.js Best Practices
我在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();
});
});
});
}
在/ subscriptions上执行GET时调用的函数是:
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路由是最佳实践吗? 有没有更好的方法来做到这一点而又无需在各处复制代码?
感谢帮助!
您可以使用生成所需函数的函数来避免代码重复,这比听起来容易:
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'));
};
在这里,关注点分离的想法开始发挥作用。 在这种情况下,您需要一个单独的nodejs模块来进行数据库调用。 该模块公开了两种方法。
/ adfeed调用函数A / subscriptions调用函数B而且,/ cronjob调用这两个函数。
通过使用SoC,您可以提高代码的重用性。 您的控制器方法没有直接调用数据库代码。 他们只负责一件事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.