【问题标题】:expressjs routing configuration object?expressjs 路由配置对象?
【发布时间】:2012-05-07 02:02:54
【问题描述】:

您可以简单地在一个对象中设置所有路由配置吗?基本上我想做的是有一个名为 routing.js 的文件,它导出一个包含所有路由的对象。必须为每条路线使用 express.get() 是很平常的。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我实际上有一个文件夹,其中包含我的路线的所有文件(我按对象将它们分开)。我也将我的控制器分离到文件中。路由文件如下所示:

    /**
     * Module dependencies.
     */
    var controller = require('../controllers/index');
    
    /**
     * The API root for this object.
     */
    
    var root = '/';
    
    /**
     * Route definitions.
     */
    var routes = function (app) {
    
      // get index
      app.get(root, controller.getIndex);
    };
    
    /**
     * Exports.
     */
    module.exports = routes;
    

    然后在我的 app.js 文件中执行此操作,它会自动加载我的所有路由文件并配置 500 和 404 路由:

    fs.readdir(__dirname + '/routes', function (err, files) {
      if (err) throw err;
      files.forEach( function (file) {
        require('./routes/' + file)(app);
      });
    
      /**
       * 500 page.
       */
      app.use( function (err, req, res, next) {
    
        if (err && err.status === 404) {
          return next();
        }
    
        res.statusCode = 500;
        res.render('404.html', {status: 500, url: req.url, error: ': ' + err.message});
      });
    
      /**
       * 404 page.
       */
      app.use( function (req, res, next) {
        res.statusCode = 404;
        res.render('404.html', {status: 404, url: req.url});
      });
    });
    

    如果不想这样读取里面的文件,导入部分就是这一行:

    require('./routes/' + file)(app);
    

    这允许您使用之前定义的路线。

    我这样做是为了保持对创建的确切路由的控制。如果你想自动化这个过程,你可以使用https://github.com/visionmedia/express-resource

    这允许你做:

    var express = require('express'), 
        Resource = require('express-resource'),
        app = express.createServer();
    
    app.resource('forums', require('./forum'));
    

    为了在 ./forum 中自动创建指向以下函数的路由:

    GET     /forums              ->  index
    GET     /forums/new          ->  new
    POST    /forums              ->  create
    GET     /forums/:forum       ->  show
    GET     /forums/:forum/edit  ->  edit
    PUT     /forums/:forum       ->  update
    DELETE  /forums/:forum       ->  destroy
    

    如果你想要更简单的东西,你可以这样做......

    var getRoutes = [['/', controller.index], ['/post', controller.showPost]];
    
    for (var i = 0, len= getRoutes.length; i < len; i++) {
       var path = getRoutes[i][0];
       var controller = getRoutes[i][1];
       app.get(path, controller);
    }
    

    【讨论】:

    • 这很好,但我正在寻找更像 {'/', controller.index}
    • 一旦您想开始将中间件添加到您的路由中,这将是非常有限的,而且您需要区分 getpostupdatedel。所以你真的只是要从app.post('/', controller.index){'post', '/', controller.index} 加上一些帮助代码。我更新了我的回复,加入了一个简单的帮助程序来注册路线。
    • 所以如果我想这样做的话,基本上我必须创建一个解释器? Express 没有内置?
    • 没有人真的想做你想做的事,所以不,它不是内置的。你需要编写几行胶水代码来连接。 Express 可以自己完成(使用 app.use/app.get/etc)并且完全自动化(使用 express-resource)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多