2015-06-08 2 views
0

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы текущий сеанс присоединился к комнате, если они проходят проверку базы данных. Если они проходят проверку, то есть запрос возвращает результат, он должен добавить пользователя в комнату. Однако, когда я вызываю socket.join («room»), он не работает, если он находится в функции обратного вызова базы данных. Вот упрощенная версия моего кода:Функции socket.io не работают в обратных вызовах

var pg = require('pg'); 
var conString = 'connection_to_postgres_server' 

var server = require('http').createServer(); 
var io = require('socket.io')(server); 
var port = 8080; 


function defaultOnSuccess(query, result){ 
    console.log("Result of query `", query, "` -> ", result); 
} 
function defaultOnError(query, err){ 
    console.log("Error of query `", query, "` -> ", err); 
} 
function runQuery(query, queryParams, onSuccess, onError){ 
    onSuccess = (typeof onSuccess !== 'undefined' ? onSuccess : defaultOnSuccess); 
    onError = (typeof onError !== 'undefined' ? onError : defaultOnError); 
    pg.connect(conString, function(err, client, done){ 
    if(err){ 
     onError(query, err); 
     done(); 
     return; 
    } 
    client.query(query, queryParams, function(err, result){ 
     if(err){ 
     onError(query, err); 
     done(); 
     return; 
     } 
     else { 
     onSuccess(query, result); 
     done(); 
     return; 
     } 
    }); 
    }); 
} 
function listenOn(channel, onNotification, onError){ 
    onError = (typeof onError !== 'undefined' ? onError : defaultOnError); 
    pg.connect(conString, function(err, client, done){ 
    if(err){ 
     onError(channel, err); 
     done(); 
     return; 
    } 
    client.on('notification', function(msg) { 
     onNotification(channel, msg); 
    }); 
    var query = client.query("LISTEN \"" + channel + "\";"); 
    done(); 
    }); 
} 

io.on('connection', function(socket){ 
    runQuery("THIS QUERY SHOULD RETURN EXACTLY ONE RESULT IF THE USER IS VALIDATED", [], 
    function(query, result){ 
     if(result.rowCount == 1){ 

     console.log("Pre rooms: ", socket.rooms); 
     socket.join("hello"); 
     console.log("Current rooms: ", socket.rooms); 
     } 
    } 
); 
}); 

io.on('connection', function(socket){ 
    socket.on('disconnect', function(){ 
    }); 
}); 

server.listen(port, function(){ 
    console.log('listening on *:' + port); 
    listenOn("project_tc_changed", 
    function(channel, message){ 
     console.log(message); 
     io.emit("data", message); 
    } 
); 
}); 

При подключении с клиентом, выход из «Pre номера:» и «Современные номера:» бревно точно так же. Кроме того, io.emit() в server.listen не работает, хотя я знаю, что код вызывается, потому что сообщение регистрируется.

Я знаю, что вызов socket.join() и вызов io.emit() достигаются, они просто не имеют никаких эффектов и не возвращают никаких ошибок.

ответ

0

Функция socket.join работает должным образом, но из-за асинхронного характера javascript ваши консольные журналы не показывают, что вы ожидали. В javascript каждая строка кода выполняется асинхронно, включая ваши socket.join и console.log. Вот почему мы должны использовать обратные вызовы, чтобы увидеть, как выглядит среда после завершения функции. socket.join позволяет этот обратный вызов. Таким образом, чтобы увидеть номер присоединиться к акции, мы просто должны изменить наши 3 строки кода следующим образом:

console.log("Pre rooms: ", socket.rooms); 
    socket.join("hello", function(){ 
     console.log("Current rooms: ", socket.rooms); 
    ); 

Что касается вашего Emit; Если вы считаете, что ваш излучатель достигнут, и сообщение содержит данные, ваш io.emit должен работать. Поэтому, не видя, как выглядит код клиентской стороны, трудно решить эту проблему.

Смежные вопросы