express 处理请求流程解析

2019-03-08  本文已影响0人  ape_caesar

前言

这里是一套简易的代码, 大致说明一个请求到达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
上一篇下一篇

猜你喜欢

热点阅读