app.js文件:
var express = require('express');
var app = express();
var requestTime = function(req, res, next) {
req.requestTime = Date.now();
next();
};
app.use(requestTime);
app.get('/', function(req, res) {
var responseText = 'Hello World!<br>';
responseText += '<small>Requested at: ' +req.requestTime + '</small>';
res.send(responseText);
});
app.listen(3000, function() { console.log('Example app listening on port 3000!');});
执行
node app.js
起服务之后,个人理解这边 ** app.use(requestTime) **好比是进行一次请求后的回调处理,所以每请求一下localhost:3000/这个路径便会输出 ** Hello world Requested at: xxxxxx(时间戳) **。
由于app.use()是中间件方法,所以它能访问request对象和response对象以及在请求-响应循环中的next中间件函数。
** function(req, res, next) **这边的第三个参数可以是任何名称,但建议取名为next,官方文档是这样建议的。
中间件函数的执行任务的过程:
- 执行代码
- 对请求以及响应对象做些改变
- 结束请求-响应的循环。
- 在栈中通知下一个中间件方法。
如果目前的中间件方法没有结束请求-响应的循环,必须调用next()方法传递给下一个中间件方法,否则请求会被一直挂起。
一个express应用能用以下几种中间件:
- 应用层中间件
- 路由层中间件
- 错误处理中间件
- 内建中间件
- 第三方中间件
在加载应用层和路由层中间件时能够加一个可选的安装路径。中间件方法也能够连续加载。
比如你在根目录中创建一个bird.js:
var express = require('express');
router.use(function timeLog(req, res, next) {
console.log('Time', Date.now());
next();
});
router.get('/', function(req, res) {
res.send('Birds home page');
});
module.exports = router;
在app.js中可以有:
注: app.use()方法能够通过任何一种http方法(get, post, put等方法)访问。
应用层的方法有: app.use()和app.METHOD()。app.METHOD方法指的是HTTP请求方法。
以下例子:
app.get('/user/:id', function (req, res, next) {
console.log('ID:', req.params.id); next();
}, function (req, res, next) {
res.send('User Info');});
// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', function (req, res, next) {
res.end(req.params.id);
});
Route处理使你能够对一个路径定义多个路由。以上例子第二个get不会被执行到,因为请求-响应循环在第一个get之后就结束了。
要跳过路由器中间件堆栈中剩余的中间件树,请用next('route')将控制权传递给下一个路由。注:next('route')仅在使用app.METHOD或router.method()函数装入的中间件函数中有效。