Node.js Nodejs:Connect和";“书面标题”;在第一个连接回调中

Node.js Nodejs:Connect和";“书面标题”;在第一个连接回调中,node.js,connect,Node.js,Connect,在connect的第一次回调中调用“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/h

在connect的第一次回调中调用“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”代码移到最后一个回调中时,一切都很好:

.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.end();
如果这不起作用,TJ Holowaychuk会在这里发表评论: 检查另一个问题。 基本上,在调用
res.writeHead
后,无法再修改头,而
next
方法将尝试修改头,这将导致异常

因此,您可以在第一次连接回调中修改标头,但不允许写入正文(
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()”。我的想法是,我在不同的回调中写入响应,然后在最后一次回调中结束响应,我不理解您链接中的注释。。。为什么使用“书面头”不是一个好主意?我对node.js很陌生,所以请耐心听我说,所以在最后一次回调中只“允许”调用“res.write”!?因为我能够在第一次回调中使用“res.setHeader('content-type','text/html');”,并且它正在工作。对,您必须在最后一次回调之前将响应保留在Head部分。谢谢您的回答