Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:代码优化和变量范围_Javascript_Node.js_Scope - Fatal编程技术网

Javascript NodeJS:代码优化和变量范围

Javascript NodeJS:代码优化和变量范围,javascript,node.js,scope,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');

对于纯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
        });
    });
}

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

而不是每次都使用这个:

res.json({
成功:没错,
信息:“ok”,
项目:文档
});
您可以扩展“res”对象,并继续以这种方式进行操作

res.ok({
项目:文档
});
我也找不到错误验证。如果在查询数据库的过程中出现错误,则应使用另一个状态响应客户端

功能(错误、文档){
如果(错误){
返回res.serverError(err);//在res对象中扩展
}
...
}
还有一件更重要的事。如果您有许多路由,您的文件将无法读取(文件将太大,并且很难更改)。 所以我的建议是将控制器和动作分开。每个控制器应位于单独的文件中

因此,您将得到如下结果:

router.get('/',函数(req,res,next){
var db=请求db;
var collection=db.get('projects');
var projects=collection.find({},{},函数(err,docs){
如果(错误){
返回res.serverError(err);
}
返回res.ok({
项目:文档
});
});
});
router.get('/:id',函数(req,res,next){
var id=请求参数id;
验证(id,函数(错误,结果){
如果(错误){
返回next();
}
var db=请求db;
var collection=db.get('projects');
var projects=collection.find({u id:id},{},函数(err,docs){
如果(错误){
返回res.serverError(err);
}
返回res.ok({
项目:文档
});
});
});
});

您还可以使用Promise以提高可读性。

没有必要在每个请求上定义db变量,您只需在代码的开头定义它,在这行var
router=express.router()之后/之前,您也可以使用,它提供了许多有用的功能。谢谢。不是一个通用的解决方案,但我从中学到了一些新的东西。非常感谢。[:thumbsup]我建议您阅读整个express文档,它简单且不长,非常适合初学者在nodeI上的web服务器上仍然可以看到大量冗余代码。我有没有办法让这个过程更模块化?还是忘了解决冗余代码问题,但我从你的回答中学到了很多。我给你一个+1。谢谢。到目前为止,这个解决方案符合我的要求。
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;
};