Express 4错误:Can't在发送标头后设置标头
Express 4 Error: Can't set headers after they are sent
我正在尝试使用Express建立一个简单的聊天系统。我刚从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
当我第一次启动服务器实例时,一切似乎都很好,直到我转到浏览器,然后错误就来了。
我一直在努力解决这个问题,阅读了几乎所有关于的帖子
Error: Can't set headers after they are sent.
但我不明白我做错了什么?这是我设置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);
错误可能是在我的index.js或socket.js文件中生成的,所以我也添加了这些。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!'}));
});
});
});
}
我是expression和node.js的新手,两天来我一直在努力了解它,所以非常感谢所有的帮助!
这种错误通常源于未return
调用您的发送函数,然后在稍后的执行中也会发送数据。
为了减轻这种情况,您应该始终返回发送。
return socket.send(JSON.stringify(message));
这将确保不会设置多个标头。
相关文章:
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- NodeJS错误-Can't在发送标头后设置标头
- 错误:Can't在从forEach循环发送标头后设置标头
- 未捕获的类型错误:无法设置属性'innerHTML'如果为null,则将脚本移动到正文不会;不起作用
- PhantomJS(vs nightwatch.js)设置cookie错误
- JavaScript数组值设置错误
- 为 jQuery Datatables ajax 调用设置错误处理程序
- 节点.js设置错误的内容长度.我该如何设置这个
- 客户端将多部分/表单数据请求的文件部分的内容类型设置错误
- 正在尝试部署Meteor应用程序--mup设置错误
- Jquery验证多个复选框设置错误位置
- js的attr函数设置错误的值
- Node.js正在处理未设置错误事件
- url中的Pc名会在IE中设置错误
- Redux表单提交验证不设置错误消息
- jquery设置错误的RequestUrl的问题
- VideoJs广告引用基本设置错误
- 无法推断查询字段以在插入时设置错误
- 如何为页面上的所有图像设置错误图像
- Jqgrid 设置错误 - this.p 未定义