Express 중간부품의 간단한 실현 원리

3078 단어
전편에서 Express의 사용을 이해한 후에 Express 중간부품의 간단한 실현 원리를 총결하였다.
우리는 Express 중간부품이 하나의 함수라는 것을 알고 있다. 그러면 어떻게 이 함수들을 질서정연하게 집행할 수 있습니까?그러면 우리가 next 함수를 호출해야 한다.사실 next 함수는 다음 중간부품 함수를 호출한다.
다음 코드는 간단한 app.use 등록 중간부품과 get, post 방식의 중간부품을 실현했다.기타 요청 방식의 중간부품은 같은 이치를 실현한다
핵심 코드:
const next = () => {
    const stack = stacks.shift()
    if(stack) {
        stack(req, res, next)
    }
}
next()

stacks는 규칙에 부합되는 모든 중간부품 함수를 저장하는 그룹 대기열입니다. 의 원칙을 따르다.즉 가장 먼저 등록된 중간부품 함수가 가장 먼저 실행되는 것이다.

구현 코드

const http = require('http')
const slice = Array.prototype.slice

 class Express {
     constructor() {
        this.router = {
            all: [], //           
            get: [],
            post: []
        }
     }

     /**
      *        
      * @param {string} path 
      * @returns {object}
      */
     middlewareHandler(path) {
        const info = {}
        if (typeof path === 'string') {
            info.path = path
            info.stack = slice.call(arguments, 1)  //      
        } else {
            info.path = '/'
            info.stack = slice.call(arguments, 0)
        }

        return info
     }

     use() {
        const allStack = this.middlewareHandler(...arguments)
        this.router.all.push(allStack)
     }

     get() {
        const getStack = this.middlewareHandler(...arguments)
        this.router.get.push(getStack)
     }

     post() {
        const postStack = this.middlewareHandler(...arguments)
        this.router.post.push(postStack)
     }

      /**
       * 
       * @param {string} method 
       * @param {string} url
       * @returns {Array} 
       */
     accordStack(method, url) {
        let stacks = []
        stacks = stacks.concat(this.router.all)
        stacks = stacks.concat(this.router[method])
        return stacks
        .filter(stack => {
            return url.indexOf(stack.path) !== -1
        }).map(item => item.stack[0])
     }

     handler(req, res, stacks) {
         //      
        const next = () => {
            const stack = stacks.shift()
            if(stack) {
                stack(req, res, next)
            }
        }
        next()
     }

     callback() {
        return (req, res) => {
            res.json = data => {
                res.setHeader('Content-Type', 'application/json')
                res.end(JSON.stringify(data))
            }
            
            //         url,           
            const {method, url} = req
            const stacks = this.accordStack(method.toLowerCase(), url)
            this.handler(req, res, stacks)
        } 
     }

     listen(...args) {
         const server = http.createServer(this.callback())
         server.listen(...args)
     }
 }

 //     ,         
module.exports = () => {
    return new Express()
}

전재 대상:https://www.cnblogs.com/qiqingfu/p/10893513.html

좋은 웹페이지 즐겨찾기