Node.js Express.js最佳实践

Node.js Express.js最佳实践,node.js,express,Node.js,Express,我在server.js中定义了以下快速路线: app.get('/adfeed', adfeed.findAll); app.get('/subscriptions', subscriptions.findAll); app.get('/cronjob/match', cronjob.match); 执行GET on/adfeed时调用的函数为: exports.findAll = function(req, res) { mongo.Db.connect(mongoUri, func

我在server.js中定义了以下快速路线:

app.get('/adfeed', adfeed.findAll);

app.get('/subscriptions', subscriptions.findAll);

app.get('/cronjob/match', cronjob.match);
执行GET on/adfeed时调用的函数为:

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();
      });
    });
  });
}
执行登录/订阅时调用的函数为:

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需要同时使用上述两个功能。从快速路线呼叫快速路线是最佳做法吗?有没有更好的方法可以做到这一点而不必到处重复代码


谢谢你的帮助

您可以使用生成所需函数的函数来避免代码重复,这比听起来容易:

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'));
};


这就是分离关注点的思想发挥作用的地方。在这种情况下,您需要一个单独的nodejs模块来进行数据库调用。该模块公开了两种方法

/adfeed调用函数A /订阅调用函数B 和,/cronjob调用这两个函数


通过使用SoC,您可以增加代码的重用。您的控制器方法没有直接调用db代码。他们只负责一件事。

你没有问这个问题,但你不应该像那样打开/关闭mongo连接:复制代码并不总是世界上最糟糕的事情,只要它不太多,并且便于维护。但是如果它有意义的话,你可以将你的逻辑重构成路由调用的独立库,从而消除重复。谢谢你,但是我的问题更多的是关于如何从一个快速路由调用和快速路由。或者如果这是错误的。。有什么想法吗?我说得通吗?
exports.findAll = function(req, res) {
  console.log("Get All Subscriptions");
  mongo.Db.connect(mongoUri, findStuffFn('subscriptions'));
};