[英]socket.io functions not working in callbacks
我遇到的問題是,如果他們通過數據庫檢查,我希望當前會話加入會議室。 如果他們確實通過了檢查,這意味着查詢將返回結果,則應將用戶添加到房間中。 但是,當我調用socket.join(“ room”)時,如果它在數據庫回調函數中不起作用。 這是我的代碼的簡化版本:
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 rooms:”和“ Current rooms:”日志的輸出完全相同。 另外,即使我知道代碼被調用,server.listen中的io.emit()也不起作用,因為消息已被記錄。
對於一個事實,我知道達到了socket.join()調用和io.emit()調用,它們只是沒有任何效果,並且沒有返回任何錯誤。
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);
);
至於你的發射; 如果您認為達到了發射並且message變量包含數據,則io.emit應該可以工作。 因此,如果看不到客戶端代碼是什么樣子,很難解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.