2017-05-10 104 views
0

在我的聊天程序中,我試圖創建一個函數,檢查數據庫中是否存在對話。如果與peopleName的對話存在,它應該在客戶端上獲取。如果與該名稱的對話不存在,則應創建新的對話。如何使功能等待回撥,然後繼續

似乎'checkConversation'函數沒有等待結果,因爲它每次都創建一個新對話,即使對話存在。

客戶端:

//Starting conversation 
 
$("#people").on("click", ".list-group-item", function() { 
 
    var peopleName = $(this).children("span").text(); 
 
    var peopleID = $(this).children("span").attr("class"); 
 
    var conversationExists = false; 
 
    socket.emit("checkConversation", peopleName, function(data) { 
 
    conversationExists = data.result; 
 
    if (conversationExists) { 
 
     console.log("Retrieved existing conversation with ", peopleName); 
 
     return; 
 
     // Check if there is a conversation in the Database where this name is conversationReceiver. ------------------------------------ 
 
     // if there is: retrieve conversation/messages 
 
     // else: create conversation. 
 
    } else { 
 
     console.log("NEW conversation with ", peopleName); 
 
     socket.emit("serverCreateConversation", peopleName, peopleID); 
 
     $("#msg").prop("readonly", false); 
 
     $("#msg").attr("placeholder", "Your message"); 
 
     $("#send").attr("disabled", false); 
 
     $("#chat").empty(); 
 
    } 
 
    }); 
 
});

服務器端:

client.on("checkConversation", function(peopleName, fn) { 
 
    var match = false; 
 
    connection.query("SELECT * FROM `conversations` WHERE `conversation_receiver` = '" + peopleName + "'", function(error, results, fields) { 
 
    if (error) { 
 
     console.log(error); 
 
    } else if (results) { 
 
     console.log("Conversation exists!", results); 
 
     match = true; 
 
    } else { 
 
     console.log(fields); 
 
    } 
 
    }); 
 
    console.log("match: " + match); 
 
    fn({ result: match }); 
 
});

+0

你的例子中data.result的輸出是什麼? – Mokkun

+0

data.result輸出爲false – JonasSH

+0

您錯過了回調點。您不會在回調中等待*,而是在回調中執行後續代碼*。 – shmosel

回答

1

你就錯了,WebSocket的不喜歡AJAX工作,你需要從您的後端發出結果,並在您的前端收聽它

,你需要在你的服務器代碼

一個socket.emit,你需要在你的客戶端代碼

+0

你能否給我一個你如何做的例子? – JonasSH

2

這似乎是the usual asynchronous callback hurdle人絆倒使用的是Node.js和其他JavaScript異步起動時在一個socket.on。

服務器端,您只需要調用fn當你從數據庫中的結果,即在回調傳遞給connection.query

client.on("checkConversation", function(peopleName, fn) { 
    connection.query("SELECT * FROM `conversations` WHERE `conversation_receiver` = '" + peopleName + "'", function(error, results, fields) { 
    if (error) { 
     console.error(error); 
     fn({ result: false, error: true }); 
     return; 
    } 
    var match = !!results; // (shorthand to turn a truthy value into true/false) 
    console.log("Conversation with " + peopleName + ": " + match); 
    fn({ result: match }); 
    }); 
}); 

(我把簡化了代碼一點點的自由)

但是,還有一個緊迫的問題:您的代碼容易受到SQL注入攻擊。請查看參數化查詢如何在您正在使用的SQL庫中工作,並使用它們代替+構建SQL查詢!

+0

謝謝!是的,我是新來的節點:-)使用你的代碼,我現在得到的消息:'與名稱對話':每次,即使它不應該是真實的。我在客戶端做對嗎? – JonasSH

相關問題