如何拆分增长过大而无法轻松维护的routes.js?

时间:2017-06-07 10:47:37

标签: node.js express mean-stack code-organization

我使用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 - 我有适用于某些功能的中间件(例如,某些路由只能由登录用户访问,而这些路由通过身份验证中间件)。目前我这样做是在中间件声明和之后的私人路线之前声明公共路线,这感觉非常黑客。如何在不同的文件中分隔公共和私有路由(以及中间件本身)?

1 个答案:

答案 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
  });