我最近开始使用node.js,express和mongodb。由于express使用connect来提供中间件支持,因此我开始阅读有关中间件和connect的文章。
我在howtonode.org上遇到了以下示例:
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();
};
有谁能告诉我这个封闭是怎么回事吗?作者称之为A
- Package idiom以挂接到对writeHead的调用 *
那是什么意思?
2条答案
按热度按时间bsxbgnwa1#
它拦截对
res.writeHead
的调用,添加一些日志记录,然后将调用委托给原始res.writeHead
。这就像是对AOP的一个超简单的方法拦截。
2ledvvac2#
让我们分解这里发生的事情
在标准 express 流中,接收请求(req)并准备响应(res)。(req,res)对可以通过一系列过滤器级联,这些过滤器可以修改req并准备res。
在流中的某个点,res将被视为已充分准备好,可以将响应的头部发送到客户端。为此将调用函数 res.writeHead*。
这个函数的原型是 function(code,headers),为了记录将要发送的头,您需要在此时挂接代码并执行一个
在某种程度上,如果代码中的原始函数是
你想用一个
在某种程度上,您希望在writeHead函数的开头“插入”一段代码。
但是您不应该尝试修改原始的writeHead代码,因为您可能甚至不知道这些代码是在哪里编写的,也不想开始查找。所以你想劫持这个函数:当一段代码将调用res.writeHead时,您希望调用的是您的函数。
一个简单的方法就是
但是如果你只这样做,你会遇到一点麻烦,因为原始的writeHead代码会丢失,并且不会被调用。因此,头将被记录,但不发送到客户端!
你需要一种方法来“记住”原始代码,并在writeHead变量的末尾调用它: