2016-02-20 2 views
0

у меня есть этот код здесь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 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 и успешно испускается, но этого нет. Кто-нибудь знает, почему это так?

+0

Я не вижу там каких-либо испусканий ... только функция on, которая испускает внутри ... плюс на стороне клиента вам нужно влезать var societ = io.connect(); – amanuel2

+0

Да, у меня уже есть объявление в клиентском коде, который подключается к моему серверу. Я пытаюсь испустить loginResponse, но он не вызывается. – goodpoutine

+0

Когда происходит вход в систему? –

ответ

0

У вас есть ошибка в коде. Асинхронные функции никогда не должны записываться внутри try/catch.

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

Проблема заключается в том, что поток управления покидает блок Try Before do_something_that_throws() запускается на выполнение, так что ошибка брошено внутри обратного вызова никогда не получает поймают.

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); 
     } 
    }); 
    }); 
}); 

Попробуйте этот подход и сообщите мне, если он работает.

+0

Я пробовал ваше решение, но у меня по-прежнему возникает проблема: socket.emit() игнорируется. Если я помещу это socket.emit() в другое место в разумном месте, где его можно вызвать, то он работает правильно, поэтому я знаю, что на стороне клиента нет ничего плохого. Вот что я пробовал: http://i.imgur.com/q2eiwW4.jpg – goodpoutine

+0

Вы должны отладить его, используя другое событие. Например - socket.emit ('test', {status: "Success"}); Теперь выпустите loginResponse из socket.on тестового события. –

+0

Итак, я пробовал несколько обходных решений, и никто из них не работает: испуская другое имя, вызывая другие методы, которые испускают сообщение, излучая другой ответ. Кажется, что query.on («end») игнорирует вызов socket.emit() и любую функцию, вызывающую socket.emit(), несмотря на то, что она печатает эти три строки. – goodpoutine

Смежные вопросы