如何拆分一个变得太大而难以维护的 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
  });