Nodejs - как заставить функции произойти только один раз? - PullRequest
4 голосов
/ 07 июня 2011

У меня есть простое приложение для чата, использующее 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});
    });
});

Вы можете увидеть res.header и res.send в сокете socket.on,Эти «res» будут выполняться постоянно и приводят к ошибке «Невозможно установить заголовки после их отправки».

Я ищу способ сделать блок -

res.header('Content-Type', 'text/plain');

res.header('Access-Control-Allow-Origin', '*');

res.send({sid:req.session.id});

случается только один раз.

Ответы [ 2 ]

8 голосов
/ 07 июня 2011
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

3 голосов
/ 07 июня 2011

Попробуйте переместить заголовки ответа из обратного вызова подключения в обратный вызов 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});
});

Но в вашем примере последовательность кажется странной.Если вы добавите обратный вызов соединения в сокет каждый раз, когда обрабатывается новый запрос, вы получите набор (потенциально) конфликтующих атрибутов сеанса.Возможно, вам придется переосмыслить вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...