Node.js 如何使函数只发生一次?

Node.js 如何使函数只发生一次?,node.js,Node.js,我得到了一个利用socket.io和express framework的简单聊天应用程序,下面是部分代码: 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',

我得到了一个利用socket.io和express framework的简单聊天应用程序,下面是部分代码:

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/”回调中:

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});
});
但在你的例子中,排序似乎很奇怪。如果每次处理一个新请求时都向套接字添加一个连接回调,那么就会得到一堆(可能)冲突的会话属性。你可能需要重新思考

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

使用

@maerics取悦你的学究我已经在get中包装了全部内容。你能澄清一下我对相关主题的理解吗,为什么在这段代码中你要在
get/
中包装那些套接字事件侦听器绑定?据我所知,socket.on只是添加了事件侦听器来侦听任何套接字连接,因此,所有这些代码段看起来都像“在有人尝试获取“/”之前不要侦听此套接字事件”,但之后它将继续侦听其他用户的事件,无论他们尝试获取什么,而且会产生更多的事件侦听器,因为有人会试图获取“/”,似乎我完全误解了某些内容…啊,似乎这不是我对socket eventlisteners垃圾邮件的误解,我在评论中提到了这一点,以获得更高的回复。。。