2017-06-07 54 views
0

我使用节点并快速创建一个休息api。我跟所有的路由,它的逻辑都保存在一个文件routes.js这样的教程:如何拆分路由.js增长过大而不易维护?

服务器JS:

var express = require('express'); 
var app = express(); 

(...) 

require('./app/routes.js')(app, port, express); 

ROUTES.JS

module.exports = function(app, port, express) { 


    var apiRoutes = express.Router(); 

(...) 

//Sample route 

    apiRoutes.get('/userfiles', function(req, res) { 
    UserFile.find({ owner: req.decoded.user.email }, function(err, filesList) { 
     if (err) 
     return done(err); 
     res.json({ success: true, files: filesList }); 
    }); 
    }); 

我的问题是双重的:

1 - 路线可以很容易地包含150行长的代码,其中一些代码长得多。将路由声明和逻辑组合在一起并不会让人觉得干净。而不是做这样的事情是一个好习惯?

apiRoutes.post('/randomRoute', function(req, res) { 
    return res.json(functionThatContainsTheActualCode(req)); 
    }); 

(然后有一个functionThatContainsTheActualCode函数与所有在不同的文件中的逻辑)。

2 - 我有适用于某些功能的中间件(例如,某些路由只能用于登录用户,而这些路由通过身份验证中间件)。目前我的做法是在中间件声明和私有路由之前声明公共路由,这感觉非常难以置信。我如何在不同的文件中分开公共和私人路线(以及中间件本身)?

回答

1

问题1:

我们需要更深入。

更改路由文件只需要实际的路由器逻辑。

routes.js

// where app = express(); 
module.exports = (app) => { 
    // index.js happens to be a file exporting the router. 
    app.use('/', require('./index')); 

    // this is basically the idea. Create a separate file for the actual logic. 
    app.use('/route', require('.path/to/file')); 
}; 

和file.js

const express = require('express'), 
    router = express.Router(); 

router.verb('/path/', (req, res, next) => { 
    // do whatever 
}); 

// this is required 
module.exports = router; 

问题2: 中间件是基本上取入request, response, next作为3 PARAMS的函数,这样做与request东西,要么发送出一个response或转移到下一个中​​间件。这就是为什么您需要拨打next,如果您想要转移到链中的下一个中间件。

现在您只需要输出一个函数,该函数需要request, response, next作为params。 //让调用这个auth.js module.exports =功能(REQ,水库,下一个){

// do logic 

    if() { 
     return res.send(); // or res.somethingThatSendsOutAHttpResponse() 
    } 

    // next middelware 
    next(); 
}; 

由于快递路线也是中间件,(介意吹),你可以将它们安装上下来了。 要验证路由,只需将auth.js中间件放在该路由的顶部。

router.get('/', require('./auth')); 
router.get('/', require('./log')); 
router.get('/', (req, res, next) => { 
    // yolo 
}); 

现在,因为这是Web开发,你仍然有问题。 现在你所有无聊的数据库查询都散布在任何地方。不要害怕,你可以通过猜测来创建另一个文件来解决这个问题。

apiRoutes.get('/userfiles', function(req, res) { 
    const userFile = require('/path/to/model/with/userfile/methods/exported/out'); 

    // do something with userFile's methods 
    }); 
+1

可以结帐github。COM/swarajgiri /快车引导。这是我上面写的一个完整的例子。 –

+0

感谢您的回应!我会尽力实现这一点。请原谅我的无知,但是sintax module.exports是什么=(app)=> {mean?它不同于module.exports = function(app){以任何方式? – kace91

+1

我的不好。它相当于'module.exports = function(app){app.use('/',require('./ index')); }' –