Socket.io 发出不被调用

Socket.io emit not being called

本文关键字:调用 io Socket      更新时间:2023-09-26

我这里有这段代码

io.on("connection", function(socket){
    //other methods where emit works
    socket.on("login", function(data) {
        try {
            pg.connect(conString, function(err, con) {
                var query = con.query("SELECT * FROM accounts WHERE username" +
                "='" + data.usn + "';");
                query.on("row", function(row, result) result.addRow(row); });
                query.on("end", function(result) {
                    if (sha512(data.pwd, result.rows[0].salt).hash ===
                        result.rows[0].password) {
                        socket.emit("loginResponse", { status: "Success" });
                        console.log("I GOT UP TO HERE WITHOUT EMITTING! WTF?");
                        console.log(sha512(data.pwd,result.rows[0].salt).hash);
                        console.log(result.rows[0].password);
                    }
                });
            });
        } catch (ex) { console.log(ex); }
    });
});

显然,在客户端,我有这样的东西:

socket.on("loginResponse", function(data) {
    alert(data.status);
});

但是,每当我尝试成功登录时,我的服务器都不会向客户端发出任何内容,即我将在我的终端上看到打印的行,但客户端没有得到服务器的响应。我一直对此感到困惑。我还有另一个函数可以触及PostgreSQL驱动程序并成功发出,但这个函数没有。有谁知道为什么会这样?

你的代码中有一个错误。异步函数永远不应该写在try/catch中。

try {
    setTimeout(function() {
        do_something_that_throws();
    }, 1000);
}
catch (e) {
    alert("You won't see this!");
}

问题是控制流在执行 do_something_that_throws() 之前离开 try 块,因此回调中抛出的错误永远不会被捕获。

socket.on("login", function(data) {    
  pg.connect(conString, function(err, con) {
    if(err) {
      // handle error
    }
    var query = con.query("SELECT * FROM accounts WHERE username" +
    "='" + data.usn + "';");
    query.on("row", function(row, result) result.addRow(row); });
    query.on("end", function(result) {
      if (sha512(data.pwd, result.rows[0].salt).hash ===
        result.rows[0].password) {
        socket.emit("loginResponse", { status: "Success" });
        console.log("I GOT UP TO HERE WITHOUT EMITTING! WTF?");
        console.log(sha512(data.pwd,result.rows[0].salt).hash);
        console.log(result.rows[0].password);
      }
    });
  });
});

尝试这种方法,让我知道它是否有效。

相关文章: