2013-03-17 82 views
0

在此先感謝您的幫助!我正在使用(以及超新的)JavaScript,使用express的node.js和sqlite3。我試圖做一個AJAX請求來獲取已發佈到聊天室網頁中的所有郵件的列表:用的setTimeout取代的setInterval

var meta = document.querySelector('meta[name=roomName]'); 
var roomName = meta.content; 

window.addEventListener('load', function(){ 
    var intervalID = setInterval(updateMessages, 4000); 
}, false); 

function updateMessages() { 
    var req = new XMLHttpRequest(); 
    req.open('GET', '/' + roomName + '/messages.json', true); 
    req.send(); 
    document.getElementById('messages').innerHTML = req.responseText; 
} 

兩個問題:1,我認爲我應該使用的setTimeout代替的setInterval的。我將如何去切換到使用這種方法? 2.下面的服務器端代碼是否與上面的代碼對應?如何訪問此請求後返回的數據?

app.get('/:roomName/messages.json', function(request, response){ 
    var roomName = request.params.roomName; 
    var sql = "SELECT ALL body FROM messages where room="+roomName+";"; 
    conn.query(sql, function(error, result) { 
     if(error) { 
     console.log("There was an error."); 
     } 
     response.send(result); 
    }); 
}); 
+0

首先,您應該使用ajax而不是sjax。並且您有SQL注入問題 – Bergi 2013-03-17 20:05:54

+0

您有一個SQL注入漏洞。 – SLaks 2013-03-17 20:06:50

+0

的間隔是一個投票權的做法,但不是一個很好的解決方案。由於您有一個Node後端,您可以輕鬆設置WebSockets,以便與客戶端高效地進行通信。看看http://socket.io/ – duckbox 2013-03-17 20:08:51

回答

0

setInterval是在這裏使用的適當的東西。

但是,請記住,您將永遠不會看到任何消息,因爲AJAX是異步,因此req.responseText將不會有任何內容。您應該使用readystatechange事件:

req.open(......); 
req.onreadystatechange = function() { 
    if(this.readyState == 4) { 
     document.getElementById('messages').innerHTML = this.responseText; 
    } 
}; 
req.send(); 
+0

太好了,謝謝!爲什麼把req.send()放在readystatechange事件之後而不是之前? – user2175732 2013-03-17 20:33:43

+0

因爲這是你應該把它們的順序。 – 2013-03-17 20:35:06

+0

哈哈沒關係,只是沒有任何意義,我爲什麼。爲什麼你設置'img.onload'您之前設置 – user2175732 2013-03-17 20:41:21