无法使用ExpressJS路由器映射路由文件

时间:2014-10-10 16:47:40

标签: javascript node.js express

我正在阅读有关ExpressJS的介绍书,不幸的是他们正在使用Express 3.x.我试图将他们的代码示例更新为Express 4.x.这是他们的例子:

路由/ 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类加载外部路由?

1 个答案:

答案 0 :(得分:2)

在快递4中,您使用路由器构建路线。

所以,假设你有routes / index.js和routes / 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;

在主服务器文件中,您可以app.use这些路由器,将它们连接到不同的地方。您也可以使用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 / foo / bar。


为了更加技术正确,您还应该只在需要它的路由上包含中间件。

您可以按路由器或每个端点执行此操作。

router.use(bodyParser.json());

// or

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

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