Nodejs:连接和“writeHead”在第一个连接callback

在连接的第一个callback中调用“res.writeHead(…)”时,总是收到错误“ 错误:发送后无法设置标题

var http = require('http'); var connect = require('connect'); var simpleApp = connect(); simpleApp .use(function(req, res, next){ res.writeHead(200, { 'content-type': 'text/html' }); res.write('response powered by SIMPLE connect-object as middelware'); console.log('Pre'); next(); console.log('Post'); }) .use(function(req, res, next){ console.log('I am the header guy!'); next(); }) .use('/admin', function(req, res, next){ console.log('someone entered the admin area....'); next(); }) .use(function(req, res){ console.log('reached the tail of the "chain of responsibility!!!'); res.end(); }); http.createServer(simpleApp).listen(process.env.PORT || 3000); console.log('Running on port "' + (process.env.PORT || 3000) + '"'); // just a save-guard to stop the process after some time... setTimeout(function(){ process.exit(0); }, 20000); 

这是错误信息:

 Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) at ServerResponse.res.setHeader (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\node_modules\connect\lib\patch.js:63:22) at next (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\node_modules\connect\lib\proto.js:156:13) at Object.handle (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\connectSampleApp.js:13:3) at next (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\node_modules\connect\lib\proto.js:193:15) at Function.app.handle (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\node_modules\connect\lib\proto.js:201:3) at Server.app (C:\Users\drt\SkyDrive\Programmierung\nodejs\silkveil\node_modules\connect\lib\connect.js:65:37) at Server.EventEmitter.emit (events.js:98:17) at HTTPParser.parser.onIncoming (http.js:2108:12) 

当我把“writeHead”代码移入最后一个callback时,一切都很好:

 .use(function(req, res){ console.log('reached the tail of the "chain of responsibility!!!'); res.writeHead(200, { 'content-type': 'text/html' }); res.write('response powered by SIMPLE connect-object as middelware'); res.end(); }); 

所以我的问题是:是否只允许在最后一次使用connect时使用writeHead / write?

检查另一个问题。 res.writeHead基本上在调用res.writeHead之后,不能再修改头文件,而next方法会尝试修改会导致exception的头文件。

所以你可以在第一个连接callback中修改头文件,但是你不能写体( res.write )。 以下代码应该正常工作。 总之,您可以修改标题,但不能刷新它们。

 var http = require('http'); var connect = require('connect'); var simpleApp = connect(); simpleApp .use(function(req, res, next){ res.statusCode = 200; res.setHeader( 'content-type', 'text/html' ); console.log('Pre'); next(); console.log('Post'); }) .use(function(req, res, next){ console.log('I am the header guy!'); next(); }) .use('/admin', function(req, res, next){ console.log('someone entered the admin area....'); next(); }) .use(function(req, res){ res.write('response powered by SIMPLE connect-object as middelware'); console.log('reached the tail of the "chain of responsibility!!!'); res.end(); }); http.createServer(simpleApp).listen(process.env.PORT || 3000); console.log('Running on port "' + (process.env.PORT || 3000) + '"'); // just a save-guard to stop the process after some time... setTimeout(function(){ process.exit(0); }, 20000); 

您在代码的第一部分中忘记了这一行:

 res.end(); 

如果这不起作用,TJ Holowaychuk在这里发表评论: https : //github.com/senchalabs/connect/issues/683#issuecomment-10018892