无法使用ExpressJS路由器映射路由文件
Unable to map routes file with ExpressJS Router
我正在读一本关于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);
});
这样做通常很好,但在某些情况下也非常重要,例如处理文件上传。
相关文章:
- 如何在映射数组中添加换行符
- Emberjs应用程序加载在除Index之外的所有路由上
- ng映射方向备选方案
- 无法通过数组映射绑定
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 使用Scala Play Framework视图中的键检索映射值
- 未激发路由的控制器属性上的观察者
- 淘汰映射;不起作用
- AngularJS ui路由器html5模式中断路由
- 角度路由when(),不映射到控制器或模板
- Angularjs:如何创建可选的路由映射参数
- Ember.js路由映射
- 无法使用ExpressJS路由器映射路由文件
- 映射路由方向缩放到段
- 路由映射?在url
- 扩展AngularJS $resource来映射Rails rest式路由(特别是$save来创建和更新)
- 映射路由历史记录
- 用Javascript以一种对seo友好的方式将URL路由映射到操作