Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 500 TypeError:侦听器必须是ServerResponse.addListener上的函数_Node.js_Express - Fatal编程技术网

Node.js 500 TypeError:侦听器必须是ServerResponse.addListener上的函数

Node.js 500 TypeError:侦听器必须是ServerResponse.addListener上的函数,node.js,express,Node.js,Express,根据投票的答案 我正在尝试实现日志记录,我们在DB中保存每个操作。为了满足这个需求,我计划在app.js中收听响应流的finish或close事件 我知道我需要把这段代码放在ExpressFrameworks的根文件夹中。请您指定确切的位置,以便我可以访问、侦听此事件并访问请求的URL。 下面是代码片段 app.use(function (req, res,next) { function afterResponse (req,res,next){ console.lo

根据投票的答案

我正在尝试实现日志记录,我们在DB中保存每个操作。为了满足这个需求,我计划在app.js中收听响应流的finish或close事件 我知道我需要把这段代码放在ExpressFrameworks的根文件夹中。请您指定确切的位置,以便我可以访问、侦听此事件并访问请求的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));
});

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

如果您想捕获每个响应,您需要在发送任何响应之前在应用程序顶部附近定义一个中间件功能(Express 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
作为参数传递,它将是
未定义的
,这正是您不想要的。只需在中间件函数本身中定义litsener,就可以访问
req
res

或者,如果您不希望在每次请求时都重新定义侦听器,您可以通过响应对象本身访问
req
,响应对象本身作为侦听器中的
上下文提供:

// 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}`);
}

如果我们不将req对象从express传递到事件侦听器,req对象将为null。我收到错误“无法读取未定义的url属性”,如果我们在事件侦听器中传递req,遇到的错误是“侦听器必须是函数”您是否使用Express 4?这在以前的版本中可能有所不同。你可以更新你的帖子或提供一个链接,让我更好地了解可能发生的事情吗?我测试了我自己的示例,以确保它们能够正常工作,因此我不确定在看不到更多代码的情况下还能说更多。顺便说一句,在原始示例中,错误消息说
侦听器必须是函数的原因是,您正在调用函数,将函数的返回值传递给
res.on()
而不是函数本身。但是,如果您遵循了我提供的示例,那么您将在不调用实际函数的情况下传递该函数,因此您不会得到相同的错误。