Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы текущий сеанс присоединился к комнате, если они проходят проверку базы данных. Если они проходят проверку, то есть запрос возвращает результат, он должен добавить пользователя в комнату. Однако, когда я вызываю 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() достигаются, они просто не имеют никаких эффектов и не возвращают никаких ошибок.