node connect


var connect = require('./connect');

var cnt =

    connect()

    .use(function (req, res) {

        res.end('hello word\n')

    })

    .listen(3000);

  1. 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 = []

  1. .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

}

)

  1. 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中。

你可能感兴趣的:(node connect)