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