纯粹的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()
块开始的代码是可以优化的,但我不确定如何继续使用它。伙计们,有什么想法?
谢谢!
答案 0 :(得分:2)
您可以编写一个函数将查询结果传递回客户端:
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
});
});
}
答案 1 :(得分:1)
我无法在这些控制器中看到您的验证
不是每次都使用它:
res.json({
success: true,
message: 'ok',
project: docs
});
你可以扩展你的“res”对象并继续这样做。
res.ok({
project: docs
});
此外,我找不到错误验证。如果在查询数据库的过程中出现错误,则应该以另一个状态响应客户端。
function(err, docs){
if ( err ){
return res.serverError(err); // extend in res object
}
...
}
还有一件更重要的事情。如果您有许多路线,您的文件将无法读取(文件太大,并且很难更改它)。 所以我的建议是将控制器和动作分开。每个控制器都应该是分开的文件。
所以,结果,你会得到这样的东西:
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来获得更多的信息。
答案 2 :(得分:0)
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;
};