NodeJS:代码优化和变量范围

时间:2015-12-26 06:24:36

标签: javascript node.js scope

纯粹的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()块开始的代码是可以优化的,但我不确定如何继续使用它。伙计们,有什么想法?

谢谢!

3 个答案:

答案 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;
};