var connect = require('./connect');
var cnt =
connect()
.use(function (req, res) {
res.end('hello word\n')
})
.listen(3000);
- connect() 执行后:生成app函数及app下挂载的几个方法:
function app(req, res, next) {
app.handle(req, res, next);
}
app.handle = function xxx
app.use = function(route, fn)
app.route = ‘/’
app.stack = []
- .use(route, func)
path 保存路径
handle 保存处理函数
对传入的参数进行判断
if route == ‘/aaaa/’
则 route.slice(0, -1) 处理成 ‘/aaa’
结果:
path: ‘/aaa’
handle: undefined
if route != ‘string’
结果
path: ‘/’
handle: route
将每个use的配置保存到app.stack中,即成为一种中间件,当请求到达后,根据是否手动调用next顺序执行handle:
app.stack.push(
{
path,
handle
}
)
- listen()
http.createServer启动server
http.createServer(
function app(req, res, next) {
app.handle(req, res, next);
}
)
每个请求都会依次遍历stack中的handle,根据route筛选符合条件的请求,并执行
当请求进来后:执行app.handle(req, res, next),此时next为undefined
每个请求的所有内容都在app.handle()这个闭包里。
index 用于记录当前正在处理第几个handle
protohost 根据url拿到host
removed
slashAdded
stack 所有的中间件函数
req.originUrl = req.url 存储url
执行next()
next中的逻辑:
if(skip this layer if the route doesn't match)next()进入下一个stack
// eg: url: /foo
route: / ‘’
匹配成功
if (route match does not border "/", ".", or end) next()进入下一个stack
// eg: url: /foo/ /foo.xxx /foo
route: /foo
匹配成功
trim off the part of the url that matches the route
请求进入 -> 自调用next()执行第1个stack里的handle -> 遇到next()执行第2个handle -> … -> 遇到next()执行第n个handle -> 执行第n个handle的剩余部分 -> … -> 第二个handle的剩余部分 -> 第一个handle的剩余部分
执行app.handle(),如果use中的函数参数为req, res, next并且无异常,需要手动调用next,否则不会到下一个use中。
网友评论