如何拆分一个变得太大而难以维护的 routes.js?
How to split a routes.js that grows too large to be easily maintained?
我正在使用 node 和 express 创建休息 api。我遵循了一个教程,其中所有路由及其逻辑都保存在 routes.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 - 我有适用于某些功能的中间件(例如,某些路由仅供登录用户访问,并且这些路由通过身份验证中间件)。目前我的做法是在中间件声明之前声明 public 路由,然后声明私有路由,这让人感觉难以置信。如何在不同文件中分隔 public 和私有路由(以及中间件本身)?
问题 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;
问题二:
中间件基本上是一个将 request, response, next
作为 3 个参数的函数,用 request
做一些事情然后发送 response
或继续下一个中间件。这就是为什么如果你想移动到链中的下一个中间件,你需要调用 next
。
现在您所需要的只是一个导出函数的文件,该函数以 request, response, next
作为参数。
// 让我们称之为 auth.js
module.exports = 函数(请求、资源、下一个){
// 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
});
既然这是网络开发,你仍然有问题。
现在,您所有无聊的数据库查询都分散在各处。
不用担心,您可以通过创建另一个文件来解决它。
apiRoutes.get('/userfiles', function(req, res) {
const userFile = require('/path/to/model/with/userfile/methods/exported/out');
// do something with userFile's methods
});
我正在使用 node 和 express 创建休息 api。我遵循了一个教程,其中所有路由及其逻辑都保存在 routes.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 - 我有适用于某些功能的中间件(例如,某些路由仅供登录用户访问,并且这些路由通过身份验证中间件)。目前我的做法是在中间件声明之前声明 public 路由,然后声明私有路由,这让人感觉难以置信。如何在不同文件中分隔 public 和私有路由(以及中间件本身)?
问题 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;
问题二:
中间件基本上是一个将 request, response, next
作为 3 个参数的函数,用 request
做一些事情然后发送 response
或继续下一个中间件。这就是为什么如果你想移动到链中的下一个中间件,你需要调用 next
。
现在您所需要的只是一个导出函数的文件,该函数以 request, response, next
作为参数。
// 让我们称之为 auth.js
module.exports = 函数(请求、资源、下一个){
// 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
});
既然这是网络开发,你仍然有问题。 现在,您所有无聊的数据库查询都分散在各处。 不用担心,您可以通过创建另一个文件来解决它。
apiRoutes.get('/userfiles', function(req, res) {
const userFile = require('/path/to/model/with/userfile/methods/exported/out');
// do something with userFile's methods
});