跳到主要内容

Express 路由

路由方法

路由方法是从 HTTP 方法之一派生的,并附加到 express 该类的实例。

Express 支持与所有 HTTP 请求方法相对应的方法: getpost等。

有一类特殊的路由方法,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()