Javascript NodeJS:代码优化和变量范围
对于纯Javascript编程来说,这是一个全新的概念,我只是想知道如何优化下面的冗余代码: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');
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;
};