2015-06-09 157 views
3

我剛開始學用快遞4的node.js我看過一些書籍和教程的路線,我也克隆了git的一些示例應用程序,但我仍然有一個很基本的問題,這我應該遵循編寫路由(或控制器)的做法嗎?我應該在哪裏放express.js

有些人定義所有航線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

有什麼技術區別?我應該遵循哪種模式?

+0

我要繼續前進,想這是風格的偏好。 – VermillionAzure

回答

2

這是完全優惠的。任何可行的模式在這裏都可能有效。 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')); 
+0

嗨,你把中間件放在哪裏?像預驗證檢查功能? – Kossel

+0

我通常不會有大量的中間件,所以我只在'app.js'裏面配置它們。如果我有一個案例,我配置了一堆中間件,那麼我可能會將它們移動到另一個文件中,並在文件中執行'module.exports = function(app){/ * config middleware * /};'。然後我可以要求它,並把它稱爲一個函數,傳入我的'app'對象。然後在那裏我可以設置所有的中間件,同時保持'app.js'的可讀性。 – Chev