美文网首页
express 处理请求流程解析

express 处理请求流程解析

作者: ape_caesar | 来源:发表于2019-03-08 00:32 被阅读0次

    前言

    这里是一套简易的代码, 大致说明一个请求到达express, express是如何处理他的。
    如果有不懂的可以评论提问, 或者有错误的地方也请帮忙指出 :)

    const qs = require('querystring')
    // 这个函数不一定会执行。 请求成功的时候都不会调用这个函数
    function finalHandle(req, res, options) {
        return function done(err) {
            var status;
            var body;
            if (err) {
                status = err.statusCode || 500;
                body = 'server crashed'
                msg = err.msg
            } else {
                status = res.statusCode || 200
                body = res.body
            }
            // write response to client
            send(req, res, status, body, msg )
        }
    }
    function send(req, res, status, body, msg) {
        if (status >= 400) {
            // send error and finish the request
            console.log('request occurs a error')
            console.log(msg)
        }
    }
    function requestHandle(req, res, callback) {
        let idx = 0;
        const done = callback || finalHandle(res, res, {})
        // middlewares and handlers we set
        let stacks = [
            (req, res, next)=>{
                console.log('** i am query middleware **')
                req.query = req.querystring ? qs.parse(req.querystring) : {};
                next()
            },
            (req, res, next)=>{
                console.log('** i am log middleware **')
                console.log(new Date().toLocaleString(), `[${req.method}]`, 'is coming')
                next()
            },
            (req, res)=>{
                console.log('** i am hello world handler **')
                res.body = 'hello world'
            },
        ]
        var layer;
        next()
        function next(err) {
            if (err) {
                done(err)
                return;
            }
            if (idx < stacks.length) {
                layer = stacks[idx]
            } else {
                return;
            }
            idx++;
            layer(req, res, next)
        }
    }
    
    // our server
    const server = {
        name: 'server',
        requestHandle: requestHandle,
    }
    
    const req = {
        name: 'I am req',
        querystring: '?name=wdw',
        method: 'GET'
    }
    const res = {
        name: 'I am res',
        body: undefined
    }
    // when a request is come, following function is working
    server.requestHandle(req, res)
    
    // after handle, now our response is
    console.log(res)
    // and server will write the response to the client
    

    相关文章

      网友评论

          本文标题:express 处理请求流程解析

          本文链接:https://www.haomeiwen.com/subject/xgzkpqtx.html