如何拆分路由.js增长过大而不易维护?
我使用节点并快速创建一个休息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:
我们需要更深入。
更改路由文件只需要实际的路由器逻辑。
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
});
可以结帐github。COM/swarajgiri /快车引导。这是我上面写的一个完整的例子。 –
感谢您的回应!我会尽力实现这一点。请原谅我的无知,但是sintax module.exports是什么=(app)=> {mean?它不同于module.exports = function(app){以任何方式? – kace91
我的不好。它相当于'module.exports = function(app){app.use('/',require('./ index')); }' –