Javascript 未调用Socket.io
我这里有这个密码Javascript 未调用Socket.io,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我这里有这个密码 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 ac
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驱动程序并成功地发出,但这个函数没有。有人知道为什么会这样吗?您的代码中有一个bug。异步函数不应写入try/catch中
try {
setTimeout(function() {
do_something_that_throws();
}, 1000);
}
catch (e) {
alert("You won't see this!");
}
问题是控制流在执行dou-something(dou-something)之前离开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);
}
});
});
});
试试这种方法,让我知道它是否有效。我在那里没有看到任何发射。。。只有内部具有发射的on函数。。。另外,在客户端,您需要包括cde var societ=io.connect();是的,我已经在连接到服务器的客户端代码中声明了。我试图发出loginResponse,但没有调用它。何时发出登录?如果我添加socket.emit(“loginResponse”,{status:“Error”});在try块之后,客户机就得到了响应。但出于某种奇怪的原因,我已经竭尽全力地寻找解决方案,根本没有调用内部emit。此外,一旦客户提交表单,就会从客户机发送登录请求。我验证了此路由是否正确,因为我可以在终端中看到console.log调用。我尝试了您的解决方案,但仍然遇到相同的问题:socket.emit()被忽略。如果我将这个socket.emit()放在可以调用它的合理位置,那么它工作正常,因此我知道客户端没有问题。以下是我尝试过的:您应该使用另一个事件来调试它。例如-socket.emit('test',{status:“Success”});现在,从测试事件的socket.on发出loginResponse。因此,我尝试了几种变通方法,但都不起作用:使用不同的名称发出,调用发出消息的其他方法,发出不同的响应。似乎query.on(“end”)忽略了socket.emit()调用和调用socket.emit()的任何函数,尽管它打印出了这三行。有趣的是,当我尝试这样做时:调用了socket.emit(),但尽管成功登录,它仍然使用了错误的数据,即它应该发送“Success”,但它发送的是“foo”即使这三行是打印出来的,看看这个-