猴子补丁(monkey patch):主要功能就是动态的属性的替换,模块运行时替换的功能。说直接点就是程序功能的追加或者变更。
例子,为res.end添加额外逻辑(clearTimeout),r又不影响es.end的执行结果。
function (req, res, next) {
`// 存储原厂设置res.end`
var end = res.end
`// res.end 重新赋值`
res.end = function (chunk, encoding) {
`// res.end 恢复原厂设置`
res.end = end
` // 重写的res.end被调用时,其内部调用原厂的res.end`
res.end(chunk, encoding)
`// 增加的额外逻辑`
clearTimeout(timer)
}
}
module.exports = function (opts) {
var time = opts.time || 100;
return function (req, res, next) {
var timer = setTimeout(function () {
console.log('is taking too long to respond', req.method, req.url)
}, time)
` // 猴子补丁 `
var end = res.end
res.end = function (chunk, encoding) {
res.end = end
res.end(chunk, encoding)
clearTimeout(timer)
}
next()
}
}