Nodejs: Connect et “writeHead” dans le premier rappel-connect

Je reçois toujours le message d’erreur ” Erreur: impossible de définir les en-têtes après leur envoi ” lors de l’appel de “res.writeHead (…)” lors du tout premier rappel de connexion:

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); 

Et voici le message d’erreur:

 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) 

Lorsque je déplace le code “writeHead” dans le dernier rappel, tout va bien:

 .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(); }); 

Ma question est donc la suivante: est-il permis d’utiliser writeHead / write dans le dernier rappel en utilisant connect?

vérifiez l’autre question. res.writeHead En gros après l’ res.writeHead de res.writeHead , l’en-tête ne pouvait plus être modifié, alors que next méthode next res.writeHead de modifier l’en-tête qui provoquerait l’exception.

Ainsi, vous pouvez modifier l’en-tête lors du premier rappel de connexion, mais vous n’êtes pas autorisé à écrire le corps ( res.write ). Le code suivant devrait fonctionner correctement. En bref, vous pouvez modifier l’en-tête mais pas les vider.

 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); 

Vous avez oublié cette ligne dans votre première partie de code:

 res.end(); 

Si cela ne fonctionne pas, voici les commentaires de TJ Holowaychuk: https://github.com/senchalabs/connect/issues/683#issuecomment-10018892