const http = require('http') const url = require('url') function createApplication() { //监听函数 let app = (req, res) => { //获取请求的方法 let _method = req.method.toLowerCase(); //获取请求的路径 let { pathname } = url.parse(req.url, true) //通过next方法进行迭代 let index = 0 function next() { if (index === app.routes.length) { res.end(`Cannot ${_method} ${pathname}`) } let { method, path, handler } = app.routes[index++] // 每次调用next就应该取出下一个layer if (method === 'middle') { if (path === '/' || path === pathname || pathname.startsWith(path + '/')) { handler(req, res, next) } else { next() //没有匹配到当前中间件 继续往下迭代 } } else { //处理路由 let { method, path, handler } = app.routes[i] if ((_method === method || method === 'all') && (path === pathname || path === '*')) { handler(req, res) } else { next() } } } next() // for (let i = 0; i < app.routes.length; i++) { // } } app.routes = []; app.use = function (path, handler) { if (typeof handler !== 'function') { handler = path path = '/' } let layer = { method: 'middle',//method中间件 path, handler, } app.routes.push(layer) } app.listen = function () { let server = http.createServer(app) server.listen(...arguments) } app.all = function (path, handler) { let layer = { method: 'all',//method是all 全部匹配 path, handler } app.routes.push(layer) } http.METHODS.forEach(method => { method = method.toLowerCase() //方法名转成小写 app[method] = function (path, handler) { let layer = { method, path, handler } app.routes.push(layer) } }) return app } module.exports = createApplication