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 db
到res.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; };