2014-10-10 66 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); 
    }); 

这通常很好,但在某些情况下也是非常重要的,例如,处理文件上传。