简体   繁体   English

Express 4错误:发送标头后无法设置标头

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

I'm trying to set up a simple chat system using Express. 我正在尝试使用Express建立一个简单的聊天系统。 I just migrated from v.3 to v.4 and now I get this error message: 我刚刚从v.3迁移到v.4,现在收到以下错误消息:

   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: 这是我设置app.js文件的代码:

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或socket.js文件中生成的,所以我也添加了这些。 Index.js: Index.js:

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

sockets.js: 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! 我是表达和node.js的新手,并且已经两天了,所以我们将不胜感激!

This kind of error usually stems from not return -ing your send functions and then something later in the execution also sends data. 这种错误通常是由于不return的-发送函数,然后在执行过程中稍后的某些操作也会发送数据。

To mitigate this you should always return sends. 为了减轻这种情况,您应该始终返回发送。

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

This will ensure that multiple headers aren't set. 这将确保未设置多个标头。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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