2012-05-06 147 views
2

你能簡單地設置單個對象中的所有路由配置嗎?基本上我想要做的是有一個名爲routing.js的文件,它導出一個包含所有路由的對象。不得不爲每條路線使用express.get()是平凡的。expressjs路由配置對象?

回答

2

我實際上有一個文件夾,它包含我的路線的所有文件(我將它們按對象分割)。我也將我的控制器分成文件。路線文件,然後這個樣子:

/** 
* 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); 
} 
+0

這很好,但我正在尋找更像{'/',controller.index}的東西 – LordZardeck

+0

一旦你想開始添加中間件到你的路由,這將會非常受限制,另外你需要區分get,post,update和del。所以你真的只是從app.post('/',controller.index)到'{'post','/',controller.index}加上一些輔助代碼。我已經更新了我的回覆,其中包括一個可以註冊路線的簡單助手。 – Bill

+0

所以基本上我必須創建一個解釋器,如果我想這樣做嗎? Express沒有內置? – LordZardeck