500 TypeError:listener必须是ServerResponse.addListener的函数

时间:2016-02-25 03:53:55

标签: node.js express

根据投票回答events.js:130 throw TypeError('listener must be a function')

我正在尝试实现Logging,其中我们保存DB中的每个操作。为了满足这个需求,我计划在app.js中收听完成或关闭响应流的事件 我知道我需要将此代码放在Express框架根文件夹中。您可以指定我可以访问的确切位置,以便侦听此事件并访问请求的URL。 以下是代码段

app.use(function (req, res,next) {
    function afterResponse (req,res,next){
         console.log("Response finished from the path "+ req.url);

    }
    res.on('finish', afterResponse(req,res,next));
});

1 个答案:

答案 0 :(得分:0)

虽然响应对象发出的'finish'事件不在documentation中,但它确实存在。但是,作为一个未记录的功能,您可能希望避免它,因为它可以随时删除。如果没有关于你想要完成什么的更多信息,很难说是否有更好的选择,尽管我怀疑有。有了这个警告,这就是你问题的答案。

如果您想捕获每个响应,您需要在发送任何响应之前在应用程序顶部附近定义一个中间件功能(快递4中的订单很重要)。你上面的例子太复杂了; 'finish'事件侦听器不接受参数。相反,你可以这样做:

// This example uses ES2015 syntax

app.use((req, res, next) => {
  res.on('finish', () => {
    console.log(`Response finished from the path ${req.url}`);
  });
  next();
});

上面的示例在发送任何请求之前添加了侦听器,但只有在发送请求后才会调用侦听器。确保监听器本身不带参数;如果您将req作为参数传递,则会为undefined,这正是您想要的。只需在中间件功能本身中定义您的litsener,您就可以根据需要访问reqres

或者,如果您不希望在每个请求上重新定义侦听器,则可以通过响应对象本身访问req,该对象本身可作为侦听器中的this上下文:< / p>

// This example uses ES2015 syntax

app.use((req, res, next) => {
  res.on('finish', onFinish);
  next();
});

function onFinish() {
  console.log(`Response finished from the path ${this.req.url}`);
}