簡體   English   中英

socket.io函數在回調中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM