路由
路由
路由用于确定应用程序如何响应用户的请求,包含一个 URI(或路径)和一个特定的 HTTP 请求方法(GET、POST 等)。
基本路由
每个路由可以有一个或多个处理函数,这些函数将在路由被访问时执行。
路由的定义使用以下结构:
app.METHOD(PATH, HANDLER)
其中,app
是 express
的实例,METHOD
是该路由的所匹配的请求方法,path
则为该路由匹配的访问路径,HANDLER
是在路由被访问时执行的函数。
例如:
app.get('/', function (req, res) {
res.send('Hello World!');
});
该方法定义了一个匹配 GET /
的路由,此时访问 http://localhost:3000/
将可看到输出 Hello World!
。
Express
支持的请求方法:get
、post
、put
、head
、delete
、options
、trace
、copy
、lock
、mkcol
、move
、purge
、propfind
、proppatch
、unlock
、report
、mkactivity
、checkout
、merge
、m-search
、notify
、subscribe
、unsubscribe
、patch
、search
和 connect
在定义 m-search
一类的路由时,请使用 app['m-search']('/', function ...
。
您也可以使用 app.all()
方法来匹配所有的请求方法。
路由路径
路径可以是字符串、字符串模式或正则表达式。
字符串:
app.get('/about', function (req, res) {
res.send('about');
});
此路由路径将匹配 /about
。
字符串模式:
app.get('/ab?cd', function(req, res) {
res.send('ab?cd');
});
此路由路径将匹配 acd
和 abcd
。
正则表达式:
app.get(/.*fly$/, function(req, res) {
res.send('/.*fly$/');
});
此路由路径将匹配 butterfly
和 dragonfly
,但是不匹配 butterflyman
、dragonfly man
等。
路由处理函数
您可以提供多个回调函数,以类似中间件的行为方式来处理请求。唯一例外是这些回调函数可能调用 next('route')
来绕过剩余的路由回调。您可以使用此机制对路由施加先决条件,在不应继续执行当前路由的情况下,可将控制权传递给后续路由。
路由处理程序的形式可以是一个函数、一组函数或者两者的结合,如以下示例中所示。
单个回调函数:
app.get('/example/a', function (req, res) {
res.send('Hello from A!');
});
多个回调函数:
app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from B!');
});
一组回调函数:
var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
var cb2 = function (req, res) {
res.send('Hello from C!');
}
app.get('/example/c', [cb0, cb1, cb2]);
你也可以把他们组合在一起。
var cb0 = function (req, res, next) {
console.log('CB0');
next();
}
var cb1 = function (req, res, next) {
console.log('CB1');
next();
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from D!');
});
响应方法
方法 | 作用 |
---|---|
res.download() | 将文件发送给用户以下载 |
res.end() | 结束响应进程 |
res.json() | 发送 JSON 响应 |
res.jsonp() | 使用 JSONP 发送 JSON 响应 |
res.redirect() | 重定向请求 |
res.render() | 渲染视图并返回 |
res.send() | 发送各种类型的响应(自动识别类型) |
res.sendFile() | 以八位元流形式发送文件 |
res.sendStatus() | 设置响应状态码并以响应主体形式发送其字符串表示 |
app.route()
您可以使用 app.route()
为路由路径创建可链接的路由处理程序。 因为在单一位置指定路径,所以可以减少冗余和输入错误。
以下是使用 app.route()
定义链式路由处理程序的示例。
app.route('/book')
.get(function(req, res) {
res.send('Get a random book');
})
.post(function(req, res) {
res.send('Add a book');
})
.put(function(req, res) {
res.send('Update the book');
});
express.Router
使用 express.Router
类来创建可安装的模块化路由处理程序。Router
实例是完整的中间件和路由系统;因此,常常将其称为“微型应用程序”。
以下示例将路由器创建为模块,在其中装入中间件,定义一些路由,然后安装在主应用程序的路径中。
在应用程序目录中创建名为 birds.js
的路由器文件,其中包含以下内容:
var express = require('express');
var router = express.Router();
// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// define the home page route
router.get('/', function(req, res) {
res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
res.send('About birds');
});
module.exports = router;
接着,在应用程序中装入路由器模块:
var birds = require('./birds');
...
app.use('/birds', birds);
此应用程序现在可处理针对 /birds
和 /birds/about
的请求,调用特定于此路由的 timeLog
中间件函数。