作为最后一步去响应一个 http 请求。这个模块被用在connect 中,作为所有中间的最后一步去响应一个请求。
API 1 var finalhandler = require ('finalhandler' )
finalhandler(req, res, [options])
调用该函数,返回一个新的函数。这个新的函数会被传入一个err
。 如果这个err
是个假值
,那么新的函数会将res
的响应码设置为404
。如果err
是真值
,那么响应一个错误的res
。
当错误发生时,以下信息会被设置到res
上:
会将res
上的status
或者statusCode
设置到res
上。如果该值小于4xx
或者大于5xx
,那么res
上的statusCode
会被设置为 500。
会依据res.statusCode
设置res.statusMessage
。
如果在生产环境下(process.env.NODE_ENV === ‘production’),会响应一个带有状态码信息的 html 页面。否则,打印堆栈信息。
任何头信息被指定在err.headers
对象中。
options.env
默认情况下,环境变量会通过process.env.NODE_ENV
指定,可以通过该选项重写。
options.onerror
指定一个错误处理函数,会按onerror(error, req, res)
形式调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 module .exports = finalhandlerfunction finalhandler (req, res, options ) { var opts = options || {} var env = opts.env || process.env.NODE_ENV || 'development' var onerror = opts.onerror return function (err ) { var headers var msg var status if (!err && headersSent(res)) { debug('cannot 404 after headers sent' ) return } if (err) { status = getErrorStatusCode(err) if (status === undefined ) { status = getResponseStatusCode(res) } else { headers = getErrorHeaders(err) } msg = getErrorMessage(err, status, env) } else { status = 404 msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req)) } debug('default %s' , status) if (err && onerror) { defer(onerror, err, req, res) } if (headersSent(res)) { debug('cannot %d after headers sent' , status) req.socket.destroy() return } send(req, res, status, headers, msg) } } function getErrorStatusCode (err ) { if (typeof err.status === 'number' && err.status >= 400 && err.status < 600 ) { return err.status } if ( typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600 ) { return err.statusCode } return undefined } function getResponseStatusCode (res ) { var status = res.statusCode if (typeof status !== 'number' || status < 400 || status > 599 ) { status = 500 } return status } function getErrorHeaders (err ) { if (!err.headers || typeof err.headers !== 'object' ) { return undefined } var headers = Object .create(null ) var keys = Object .keys(err.headers) for (var i = 0 ; i < keys.length; i++) { var key = keys[i] headers[key] = err.headers[key] } return headers } function getErrorMessage (err, status, env ) { var msg if (env !== 'production' ) { msg = err.stack if (!msg && typeof err.toString === 'function' ) { msg = err.toString() } } return msg || statuses[status] }
发送最终的响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function send (req, res, status, headers, message ) { function write ( ) { var body = createHtmlDocument(message) res.statusCode = status res.statusMessage = statuses[status] setHeaders(res, headers) res.setHeader('Content-Security-Policy' , "default-src 'self'" ) res.setHeader('X-Content-Type-Options' , 'nosniff' ) res.setHeader('Content-Type' , 'text/html; charset=utf-8' ) res.setHeader('Content-Length' , Buffer.byteLength(body, 'utf8' )) if (req.method === 'HEAD' ) { res.end() return } res.end(body, 'utf8' ) } if (isFinished(req)) { write() return } unpipe(req) onFinished(req, write) req.resume() }
最后更新时间:2018-12-04 22:49:01
文章中有任何不对或者讲的不足的地方,欢迎评论,也可发邮件至794465731@qq.com或者xxxxxmiss@gmail.com