我想实现以下目标:
var c = require('connect'); var app = c(); app.use("/api", function(req, res, next){ console.log("request filter 1"); next(); }); app.use("/api", function(req, res, next){ console.log("request filter 2"); next(); }); app.use("/api", function(req, res, next){ console.log("request handler"); res.end("hello"); next(); }); app.use("/api", function(req, res, next){ console.log("response post processor"); next(); }); app.listen(3000);
当我卷曲地址时,控制台出现异常,抱怨标头在发送后无法被打扰,这很公平。只是我不触摸响应对象。
/usr/bin/node app2.js request filter 1 request filter 2 request handler Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:644:11) at ServerResponse.res.setHeader (/home/zpace/node_modules/connect/lib/patch.js:59:22) at next (/home/zpace/node_modules/connect/lib/proto.js:153:13) at Object.handle (/home/zpace/WebstormProjects/untitled1/app2.js:25:5) at next (/home/zpace/node_modules/connect/lib/proto.js:190:15) at Object.handle (/home/zpace/WebstormProjects/untitled1/app2.js:19:5) at next (/home/zpace/node_modules/connect/lib/proto.js:190:15) at Object.handle (/home/zpace/WebstormProjects/untitled1/app2.js:14:5) at next (/home/zpace/node_modules/connect/lib/proto.js:190:15) at Function.app.handle (/home/zpace/node_modules/connect/lib/proto.js:198:3)
调试NodeJS / Connect层我陷入了某种程度上暗示着,如果已经发送了报头,则执行路由处理程序必须初始化响应报头。
问题是上述行为是否是故意的(即,路由处理程序完成发送响应后执行任何代码是完全难以想象的,还是仅仅是连接中的错误?
不知道您是否找到解决方案。
如果要为请求周期设计后处理器,则可以使用中间件来侦听响应对象上的“完成”事件。像这样:
app.use(function(req, res, next){ res.on('finish', function(){ console.log("Finished " + res.headersSent); // for example console.log("Finished " + res.statusCode); // for example // Do whatever you want }); next(); });
写入响应后,将执行附加到“ finish”事件的函数(这意味着NodeJS已将响应头和主体传递给OS进行网络传输)。
我想这一定是您想要的。