Express 路由
路由方法
路由方法是从 HTTP 方法之一派生的,并附加到 express 该类的实例。
Express 支持与所有 HTTP 请求方法相对应的方法: get
,post
等。
有一类特殊的路由方法,app.all()
用于为所有 HTTP 请求方法的路径加载中间件功能。例如,无论是使用 GET, POST, PUT, DELETE 还是 http 模块支持的任何其他 HTTP 请求方法,都会对路由 /secret
的请求执行以下处理程序。
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...');
next(); // pass control to the next handler
});
路由路径
路由路径与请求方法结合,定义了可以进行请求的端点。路由路径可以是字符串,字符串模式或者正则表达式。
字符?
,+
,*
和()
是他们的正则表达式的对应的子集。连字符(-
)和点(.
)由基于字符串的路径按字面意义进行解释。
如果需要$
在路径字符串中使用美元字符(),请将其转义([并括在和中])
。例如:/data/$book
处用于请求的路径字符串将为/data/([\$])book
。
// 匹配 /random.text 路径
app.get('/random.text', function (req, res, next) {
res.send('random.text');
});
// 匹配 /abcd 或 /acd 路径
app.get('/ab?cd', function (req, res, next) {
res.send('ab?cd');
});
// 匹配 /abASaascd 或 /abcd 路径 *表示任意
app.get('/ab*cd', function (req, res, next) {
res.send('ab*cd');
});
// 匹配 /abcde 或 /abe 路径
app.get('/ab(cd)?e', function (req, res, next) {
res.send('ab(cd)?e');
});
// 匹配 /abcde 或 /abe 路径
app.get('/ab(cd)?e', function (req, res, next) {
res.send('ab(cd)?e');
});
// 匹配带有 a 的路径
app.get('/a/', function (req, res, next) {
res.send('/a/');
});
// 匹配带有 fly 结尾的路径
app.get('/.*fly$/', function (req, res, next) {
res.send('.*fly$/');
});
路径参数
路由参数被命名为 URL 段,用于捕获 URL 中在起位置处指定的值。捕获的值将填充到 req.params
对象中,并将路径中指定的 route 参数的名称作为其各自的键。
// Route path: /users/:userId/books/:bookdId
// Route URL: http://localhost:3000/users/34/books/8989
// req.params { userId: '34', bookdId: '8989' }
要使用路由参数定义路由,只需要在路由路劲中指定路由参数,如下:
app.get('/users/:userId/books/:bookdId', function (req, res, next) {
res.send(req.params);
});
路径参数的名称必须由『文字字符』(A-Za-z0-9_
)组成。
由于连字符(-
)和点(.
)是按照字面意思解释的,因此可以将它们与路径参数一起使用,以实现有用的目的。
// Route path: /flights/:from-:to
// Route URL: http://localhost:3000/flights/:A-:B
// req.params { from: 'A', to: 'B' }
// Route path: /flights/:from.:to
// Route URL: http://localhost:3000/flights/:A.:B
// req.params { from: 'A', to: 'B' }
要更好地控制可以由 route 参数匹配的确切字符串,可以在括号后面附加一个正则表达式:
// Route path: /users/:userId(\\d+)
// Route URL: http://localhost:3000/users/12
// req.params { userId: '12' }
路由处理程序
app.get('/example/a', function (req, res) {
res.send('Hello from A!');
});
多个回调处理一条路由:
app.get(
'/example/a',
function (req, res, next) {
next();
},
function (req, res) {
res.send('Hello from B!');
}
);
回调函数数组:
app.get('/example/a', [cb1, cb2]);
res 对应方法
- res.download():提示要下载
- res.end():结束响应
- res.json():发送 JSON 响应
- res.jsonp():发送带有 JSONP 支持的 JSON 响应
- res.redirect():重定向请求
- res.render():渲染视图模板
- res.send():发送各种类型的响应
- res.sendFile():将文件作为八位字节流发送
- res.sendStatus():设置响应状态代码,并将其字符串表示形式发送为响应正文
app.route()
- 链式处理程序
快速路由器
express.Router()