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

Unable to map routes file with ExpressJS Router

本文关键字:映射 路由 文件 路由器 ExpressJS      更新时间:2023-09-26

我正在读一本关于ExpressJS的介绍书,不幸的是,他们正在使用Express3.x。我正试图将他们的代码示例更新到Express4.x。以下是他们的示例:

路由/索引.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被弃用,node抛出了一个错误

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

在express 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;

在你的主服务器文件中,你可以应用这些路由器,将它们连接在不同的地方。你也可以使用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);
  });

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