2014-10-10 97 views
1

我正在閱讀有關ExpressJS的介紹手冊,不幸的是他們使用Express 3.x.我試圖讓他們的代碼示例更新爲Express 4.x.下面是其實例:無法使用ExpressJS路由器映射路由文件

路由/ index.js

exports.index = function(req, res){ 
    res.send('welcome'); 
}; 

app.js

var express = require('express'); 
var http = require('http'); 
var app = express(); 

// Load the route handlers 
var routes = require('./routes'); 

// Add router middleware explicitly 
app.use(app.router); 

// Routes 
app.get('/', routes.index); 

http.createServer(app).listen(3000, function(){ 
console.log('App started'); 
}); 

這裏,app.router被棄用,節點引發錯誤了。我已經更新了代碼:

var http = require('http'); 
var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var router = express.Router(); 

var routes = require('./routes'); 
router.get('/', routes.index); 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

http.createServer(app).listen(3000, function() { 
    console.log('Express app started'); 
}); 

然而,當訪問localhost:3000,我得到這個錯誤在瀏覽器中顯示:

Cannot GET/

如果我完全刪除Router類的使用(和刪除app.use(app.router))我可以這樣做:

app.get('/', routes.index); 

,這將正常工作。

如何使用Router類加載我的外部路由?

回答

2

在快遞4中,您使用路由器構建您的路線。

所以,說你有路線/ index.js和路由/ foo.js,他們將是這個樣子:

// routes/index.js 
var router = require('express').Router(); 

router.get('/', function(req, res){ 
    res.send('Hello!'); 
}); 

module.exports = router; 
// routes/foo.js 
var router = require('express').Router(); 

router.get('/bar', function(req, res){ 
    res.send('foobar'); 
}); 

module.exports = router; 

在主服務器上的文件,你可以再應用。使用這些路由器,將它們連接到各個地方。您也可以使用router.use將路由器連接到路由器(例如/ users/user-id/pictures/picture-id種類的路由)。

// server.js 
var http = require('http'); 
var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 

app.use('/', require('./routes/index')); 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 

app.use('/foo', require('./routes/foo')); 

app.listen(3000); 

而你現在應該能夠GET /和GET/foo/bar。


要獲得更多的技術上的正確性,您還應該只在需要它的路由上包含中間件。

您可以爲每個路由器或每個端點執行此操作。

router.use(bodyParser.json()); 

// or 

router.route('/baz') 
    .use(bodyParser.json()) 
    .post(function(req, res){ 
    res.status(201).json(req.body); 
    }); 

這通常很好,但在某些情況下也是非常重要的,例如,處理文件上傳。