简体   繁体   中英

Express 4 Error: Can't set headers after they are sent

I'm trying to set up a simple chat system using Express. I just migrated from v.3 to v.4 and now I get this error message:

   info  - socket.io started
Express server listening on port 3000
GET / 304 790.443 ms - -
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:707:11)
    at ServerResponse.res.setHeader (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/patch.js:134:22)
    at Object.expressInit [as handle] (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/lib/middleware.js:20:42)
    at next (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/proto.js:174:15)
    at Object.query [as handle] (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/middleware/query.js:43:5)
    at next (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/proto.js:174:15)
    at Function.app.handle (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/proto.js:182:3)
    at Server.app (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/connect/lib/connect.js:67:37)
    at Manager.handleRequest (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/socket.io/lib/manager.js:564:28)
    at Server.<anonymous> (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/socket.io/lib/manager.js:118:10)
GET /javascripts/jquery.min.js 304 7.874 ms - -
GET /javascripts/jquery.min.js 304 7.966 ms - -
GET /javascripts/chat.js 304 4.132 ms - -
GET /javascripts/chat.js 304 4.213 ms - -
GET /socket.io/socket.io.js 404 11.137 ms - 35
GET /stylesheets/style.css 304 1.715 ms - -
GET /stylesheets/style.css 304 1.798 ms - -
Error: Can't set headers after they are sent.
    at SendStream.headersAlreadySent (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:319:13)
    at SendStream.send (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:501:17)
    at onstat (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:600:10)
    at Object.oncomplete (fs.js:107:15)
Error: Can't set headers after they are sent.
    at SendStream.headersAlreadySent (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:319:13)
    at SendStream.send (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:501:17)
    at onstat (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:600:10)
    at Object.oncomplete (fs.js:107:15)
Error: Can't set headers after they are sent.
    at SendStream.headersAlreadySent (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:319:13)
    at SendStream.send (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:501:17)
    at onstat (/Users/bruger/Google Drev/Uni/8. semester/Real-Time-Webapplikationer/0786OS_Code/Chapter 04/section02/awesome-chat/node_modules/express/node_modules/send/index.js:600:10)
    at Object.oncomplete (fs.js:107:15)
   debug - served static content /socket.io.js

When I first start up the server instance, everything seems fine, until I go to the browser, then the error comes.

I've been trying to solve the issue reading almost all of the posts about

Error: Can't set headers after they are sent.

But I can't figure out what I'm doing wrong? Heres my code where I set up the app.js file:

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path');

var methodOverride = require('method-override')                     
var json = require('json-middleware');                              
var multipart = require('connect-multiparty');                      
var multipartMiddleware = multipart();                              

var app = express();

// Express 4 version
var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
   // configure stuff here
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(json);                                                    
  app.use('/public/javascripts/chat.js', multipartMiddleware);      
  //app.use(express.bodyParser());                                  
  //app.use(express.methodOverride());                              
  app.use(methodOverride('_method'))
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
}


app.get('/', routes.index);

var server = http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

//routes.sockets.connect(server);
require('./routes/sockets.js').initialize(server);

It might be that the error is generated in my index.js or socket.js file, so I add these too. Index.js:

exports.index = function(req, res){
  res.render('index', { title: 'Express Chat' });
};

sockets.js:

var io = require('socket.io');

exports.initialize = function(server) {
  io = io.listen(server);
  io.sockets.on("connection", function(socket){
    socket.on('message', function(message){
      message= JSON.parse(message);
      if(message.type == "userMessage"){
        socket.get('nickname', function(err, nickname){
          message.username=nickname;
          socket.broadcast.send(JSON.stringify(message));
          message.type = "myMessage";
          socket.send(JSON.stringify(message));
        });        
      }
    });

    socket.on("set_name", function(data){
      socket.set('nickname', data.name, function(){
        socket.emit('name_set', data);
    socket.send(JSON.stringify({type:'serverMessage', message: 'Welcome to the most interesting chat room on earth!'}));          
      });
    });
  });
}

I'm new to express and node.js and been trying to get my head around it for two days now, so all help would be highly appreciated!

This kind of error usually stems from not return -ing your send functions and then something later in the execution also sends data.

To mitigate this you should always return sends.

  return socket.send(JSON.stringify(message));

This will ensure that multiple headers aren't set.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM