Nodejs – 如何使function只发生一次?

我有一个简单的聊天应用程序利用socket.io和expression框架,下面是代码的一部分:

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}); 

– 只发一次。

 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'); }); socket.once('connection', function(client) { //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}); }); }); 

使用.once

尝试将响应头移出连接callback,并移入“get /”callback:

 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'); }); res.header('Content-Type', 'text/plain'); res.header('Access-Control-Allow-Origin', '*'); res.send({sid:req.session.id}); }); 

但在你的例子中,sorting似乎很奇怪。 如果每次处理新的请求时都向套接字添加连接callback,那么会得到一堆(可能)冲突的会话属性。 你可能需要重新思考。