【问题标题】:Where should I put routes in express.js我应该在 express.js 中的哪里放置路线
【发布时间】:2015-06-09 21:32:25
【问题描述】:

我刚开始用express 4学习node.js。我已经阅读了一些书籍和教程,我还从git中克隆了一些示例应用程序,但我仍然有一个非常基本的问题,我应该遵循哪种做法来编写路由(或控制器)?

有些人在app.js中定义了所有的路由,并在控制器中导出了所有的功能:

app.js

    ....
    var homeController = require('./controllers/home');
    var userController = require('./controllers/user');
    ....
    app.get('/', homeController.index);
    app.get('/login', userController.getLogin);
    app.get('/logout', userController.logOUT);
    app.get('/doStuff', userController.doStuff);

然后在控制器/user.js中

    exports.getLogin = function(req, res) {
        //logic...
      });
    exports.logout = function(req, res) {
        //logic...
      });
    exports.doStuff = function(req, res) {
        //logic...
      });

另一种方式就像 express-generator 方式: app.js

...
app.use('/users', users);
...

控制器/users.js

    ....
    router.get('/login', function(req, res, next) {
      //logic...
    });
    router.get('/logout', function(req, res, next) {
      //logic...
    });
    router.get('/doStuff', function(req, res, next) {
      //logic...
    });

module.exports = router;

还有一些更动态的,比如this proposal

有任何技术差异吗?我应该遵循哪种模式?

【问题讨论】:

  • 我会继续猜测这是风格偏好。

标签: node.js express


【解决方案1】:

这是完全优惠的。任何有效的模式都可能在这里有效。 Express 路由器使事情变得非常好并且易​​于设置。就个人而言,我更喜欢为每个顶级路由创建一个目录,为第二级创建文件,为第三级创建导出。这是我如何为一组 API 路由进行布局的示例。

目录:

routes/
  index.js <- master route manifest
  api/
    index.js <- api routes manifest
    books.js
    authors.js
  landing-pages/
    index.js
    awesome-deal.js

路由清单:

// routes/index.js
var router = require('express').Router();
router.use('/api', require('./api'));
router.use('/landing', require('./landing-pages'));
module.exports = router;

API 路由清单:

// routes/api/index.js
var router = require('express').Router();
router.use('/books', require('./books.js'));
router.use('/authors', require('./authors.js'));
module.exports = router;

实体端点:

// routes/api/books.js
var router = require('express').Router();
var db = require('mongoose-simpledb').db;
router.get('/get/:id', function (req, res) {
  var id = req.param('id');
  db.Book.findOneById(id, function (err, book) {
    if (err) throw err;
    res.json(book);
  });
});
router.post('/new', /* etc... */);
return router;

然后在我的应用文件中我只设置顶级路由:

// app.js
/* express setup.... */
app.use('/', require('./routes'));

【讨论】:

  • 嗨,你把中间件放在哪里?像预授权检查功能?
  • 我通常没有大量的中间件,所以我只是在app.js 中配置它们。如果我有配置大量中间件的情况,那么我可能会将它们移动到另一个文件并在文件中执行module.exports = function (app) { /* config middleware */};。然后我可以要求它并像函数一样调用它,传入我的app 对象。然后在里面我可以设置我所有的中间件,同时保持app.js 更具可读性。
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多