NodeJS:代码优化和variables范围

真正新到纯JavaScript编程,我只是想知道如何优化下面的冗余代码:

module.exports = function(app, express) { var router = express.Router(); router.get('/', function (req, res, next) { var db = req.db; var collection = db.get('projects'); var projects = collection.find({}, {}, function(e, docs){ res.json({ success: true, message : 'ok', projects: docs }); }); }); router.get('/:id', function (req, res, next) { var db = req.db; var collection = db.get('projects'); var projects = collection.find({_id: req.params.id}, {}, function(e, docs){ res.json({ success: true, message : 'ok', project: docs }); }); }); return router; }; 

正如你可以看到var dbres.json()块的代码是可优化的,但我不知道如何处理它。 任何想法,家伙?

谢谢!

您可以编写一个函数将查询结果传递回客户端:

 function handleQuery(query, req, res, next) { var db = req.db; var collection = db.get('projects'); var projects = collection.find(query, {}, function(e, docs){ res.json({ success: true, message : 'ok', project: docs }); }); } 

那么你的路线可以崩溃到这些:

 router.get('/', function (req, res, next) { handleQuery({}, req, res, next); }); router.get('/:id', function (req, res, next) { handleQuery({_id: req.params.id}, req, res, next); }); 

当你在这里,意识到你没有正确处理错误。 要正确处理错误,你应该检查e的值。 如果这是真的,你有一个错误,你需要适当地处理它,例如像这样:

 function handleQuery(query, req, res, next) { var db = req.db; var collection = db.get('projects'); var projects = collection.find(query, {}, function(e, docs){ if(e) { return next(e); } res.json({ success: true, message : 'ok', project: docs }); }); } 

我在这些控制器中看不到您的validation

而不是每次都使用这个:

  res.json({ success: true, message: 'ok', project: docs }); 

你可以扩展你的“res”对象并继续这样做。

 res.ok({ project: docs }); 

此外,我无法find错误validation。 如果在查询数据库的过程中遇到错误,则应以另一个状态响应客户端。

 function(err, docs){ if ( err ){ return res.serverError(err); // extend in res object } ... } 

还有一个重要的事情。 如果你有很多路由,你的文件将是不可读的(文件太大了,很难改变它)。 所以我的build议是把控制器和一个动作分开。 每个控制器应该是分开的文件。

所以,所以,你会得到这样的东西:

  router.get('/', function (req, res, next) { var db = req.db; var collection = db.get('projects'); var projects = collection.find({}, {}, function(err, docs){ if(err){ return res.serverError(err); } return res.ok({ projects: docs }); }); }); 
  router.get('/:id', function (req, res, next) { var id = req.params.id; ControllerName.validate(id, function(err, result){ if(err){ return next(); } var db = req.db; var collection = db.get('projects'); var projects = collection.find({_id: id}, {}, function(err, docs){ if(err){ return res.serverError(err); } return res.ok({ project: docs }); }); }); }); 

你也可以使用Promise来获得更多的可读性。

 module.exports = function(app, express) { var router = express.Router(); router.get(['/', '/:id'], function (req, res, next) { var db = req.db; var collection = db.get('projects'); var search = req.params.id ? {id: req.params.id} : {} var projects = collection.find(search, {}, function(e, docs){ res.json({ success: true, message : 'ok', projects: docs }); }); }); return router; };