路由
路由路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| var express = require('express');
var app = express();
// GET method route
app.get('/', function (req, res) {
res.send('GET request to the homepage');
});
// POST method route
app.post('/', function (req, res) {
res.send('POST request to the homepage');
});
// 匹配 /about 路径的请求
app.get('/about', function (req, res) {
res.send('about');
});
|
TTP 请求对应的路由方法: 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。
正则表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
res.send('ab?cd');
});
// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
res.send('ab+cd');
});
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd', function(req, res) {
res.send('ab*cd');
});
// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
res.send('ab(cd)?e');
});
|
路由句柄
1
2
3
4
5
6
| app.get('/example/b', function (req, res, next) {
console.log('response will be sent by the next function ...');
next();
}, function (req, res) {
res.send('Hello from B!');
});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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]);
|
混合使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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('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() |
设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。 |
链式路由句柄
1
2
3
4
5
6
7
8
9
10
| 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');
});
|
模块化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| var express = require('express');
var router = express.Router();
// 该路由使用的中间件
router.use(function timeLog(req, res, next) {
console.log('Time: ', Date.now());
next();
});
// 定义网站主页的路由
router.get('/', function(req, res) {
res.send('Birds home page');
});
// 定义 about 页面的路由
router.get('/about', function(req, res) {
res.send('About birds');
});
module.exports = router;
|
1
2
3
| var birds = require('./birds');
...
app.use('/birds', birds);
|
中间件
应用级中间件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| var app = express();
// 没有挂载路径的中间件,应用的每个请求都会执行该中间件
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
// 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
res.send('USER');
});
|
路由级中间件
1
2
3
4
5
6
7
8
9
10
11
12
13
| var app = express();
var router = express.Router();
router.use('/user/:id', function(req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 将路由挂载至应用
app.use('/', router);
|
错误处理中间件
1
2
3
4
| app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});
|
内置中间件
1
2
3
4
5
6
7
8
9
10
11
12
13
| var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}
}
app.use(express.static('public', options));
|
静态目录
1
2
3
| app.use(express.static('public'));
app.use(express.static('uploads'));
app.use(express.static('files'));
|
第三方中间件
1
| $ npm install cookie-parser
|
1
2
3
4
5
6
| var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
// 加载用于解析 cookie 的中间件
app.use(cookieParser());
|
我的博客