我试图了解中间件的工作原理,特别是 NodeJS 的 Connect 模块。我正在浏览这个http://howtonode.org/connect-it并找到了这个例子:
module.exports = function logItSetup() {
// Initialize the counter
var counter = 0;
return function logItHandle(req, res, next) {
var writeHead = res.writeHead; // Store the original function
counter++;
// Log the incoming request
console.log("Request " + counter + " " + req.method + " " + req.url);
// Wrap writeHead to hook into the exit path through the layers.
res.writeHead = function (code, headers) {
res.writeHead = writeHead; // Put the original back
// Log the outgoing response
console.log("Response " + counter + " " + code + " " + JSON.stringify(headers));
res.writeHead(code, headers); // Call the original
};
// Pass through to the next layer
next();
};
};
所以我知道它会记录传入的请求和响应。但是即使有文章中的以下解释,我仍然不明白您需要用替换函数替换 writeHead:
“设置函数是设置中间件跨请求使用的变量的好地方。在这种情况下,我们正在初始化记录器的计数器。
在处理程序中,我们使用包装习语来挂钩对 writeHead 的调用。在 JavaScript 中,函数是值,就像其他任何东西一样。因此,包装函数的一个好方法是将对原始实现的引用存储在闭包变量中。将函数替换为新函数,并在新函数的第一行中,将旧函数定义放回原处。然后在替换函数的最后一行调用原来的。这是挂钩现有对象方法的一种简单而有效的方法,因为它们只是按名称查找属性,而不是对实际函数对象的引用。
独立的 console.log 调用将在每个请求周期开始时调用,嵌套的 console.log 将在退出时通过嵌套的 writeHead 函数调用。”