繁体   English   中英

Express.js最佳做法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM