我有一个简单的聊天应用程序,利用了socket.io和express框架,以下是部分代码:
var app = express.createServer();
var socket = io.listen(app);
var store = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({
secret: 'something',
store: store,
cookie: {
maxAge: 60*60*24*30*1000
}
}));
app.get('/', function(req, res){
socket.on('connection', function(client) {
req.session.ioid = client.sessionId;
req.session.channel = req.param('channel');
req.session.username = req.param('username');
//I want the code below happen just once
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
});
});
你可以在socket.on的闭包中看到res.header和res.send。这些“res”将一直执行,并导致错误“无法在发送后设置标头”。我正在寻找一种方法使此代码块 -
res.header('Content-Type', 'text/plain');
res.header('Access-Control-Allow-Origin', '*');
res.send({sid:req.session.id});
-发生一次。
get /
中呢?据我所知,socket.on 只是添加事件监听器以便监听任何套接字连接,因此整个代码片段看起来像是“在有人尝试获取 '/' 之前不要监听此套接字事件”,但随后它将继续监听其他用户的事件,无论他们尝试获取什么,并且当有人尝试获取 '/' 时,它还会生成更多的事件监听器。看起来我完全误解了什么... - Max Yari