我使用node和express来创建一个rest api。我按照教程将所有路由及其逻辑保存在routes.js
文件中,如下所示:
SERVER 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 - 我有适用于某些功能的中间件(例如,某些路由只能由登录用户访问,而这些路由通过身份验证中间件)。目前我这样做是在中间件声明和之后的私人路线之前声明公共路线,这感觉非常黑客。如何在不同的文件中分隔公共和私有路由(以及中间件本身)?
答案 0 :(得分: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个参数,对request
执行某些操作,然后发送response
或继续下一个中间件。这就是为什么如果你想转移到链中的下一个中间件,你需要调用next
。
现在您只需要一个导出函数的文件,该函数将request, response, next
作为参数。
//让我们调用这个auth.js
module.exports = function(req,res,next){
// 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 dev,你仍然遇到问题。 现在,所有无聊的数据库查询都分散在各处。 不用担心,你可以通过猜测来创建另一个文件来解决它。
apiRoutes.get('/userfiles', function(req, res) {
const userFile = require('/path/to/model/with/userfile/methods/exported/out');
// do something with userFile's methods
});