javascript 有人能解释一下howtonode中的函数 Package 习惯用法吗?

f45qwnt8  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(121)

我最近开始使用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的调用 *

那是什么意思?

bsxbgnwa

bsxbgnwa1#

它拦截对res.writeHead的调用,添加一些日志记录,然后将调用委托给原始res.writeHead
这就像是对AOP的一个超简单的方法拦截。

2ledvvac

2ledvvac2#

让我们分解这里发生的事情

wrapping idiom to hook into the call to writeHead

在标准 express 流中,接收请求(req)并准备响应(res)。(reqres)对可以通过一系列过滤器级联,这些过滤器可以修改req并准备res
在流中的某个点,res将被视为已充分准备好,可以将响应的头部发送到客户端。为此将调用函数 res.writeHead*。
这个函数的原型是 function(code,headers),为了记录将要发送的头,您需要在此时挂接代码并执行一个

console.log("Response " + code + " " + JSON.stringify(headers));

在某种程度上,如果代码中的原始函数是

res.writeHead = function(code, headers) {
    // original code
}

你想用一个

res.writeHead = function(code, headers) {
    console.log("Response " + code + " " + JSON.stringify(headers));
    // original code
}

在某种程度上,您希望在writeHead函数的开头“插入”一段代码。
但是您不应该尝试修改原始的writeHead代码,因为您可能甚至不知道这些代码是在哪里编写的,也不想开始查找。所以你想劫持这个函数:当一段代码将调用res.writeHead时,您希望调用的是您的函数。
一个简单的方法就是

return function logItHandle(req, res, next) {
   res.writeHead = function (code, headers) {
       console.log("Response " + code + " " + JSON.stringify(headers));
   }
   next(); 
}

但是如果你只这样做,你会遇到一点麻烦,因为原始的writeHead代码会丢失,并且不会被调用。因此,头将被记录,但不发送到客户端!
你需要一种方法来“记住”原始代码,并在writeHead变量的末尾调用它:

return function logItHandle(req, res, next) {

   // save the original writeHead function so that it can be referenced in the closure
   var originalWriteHead = res.writeHead; 

   res.writeHead = function (code, headers) {

       // log the response headers
       console.log("Response " + code + " " + JSON.stringify(headers));

       // make as if our hook never existed in the flow
       res.writeHead = originalWriteHead ;

       // call the original writeHead because otherwise the external code
       // called our implementation of writeHead instead of the original code
       res.writeHead(code, headers);

   }
   next(); 
}

相关问题