2017-06-01 67 views
0

我正在嘗試編寫一個循環來每30秒更新一次網頁,但我不確定如何使用setInverval函數進行ajax調用。這裏是我的服務器代碼:使用Ajax和Nodejs更新頁面上的數據

var app = express() 
app.get('/', function(req, res){ 
// error here 
res.sendFile('./index.html',{root: __dirname}) 
//...Some data 
res.send(data) 
}); 

我有我的index.html一個setInverval功能:

<script> 
function ajaxCall(){ 
    $.ajax({url: "http://localhost:3000/", success: function(result){ 
    // I want to receive new result every 30 seconds 
    }}) 

} 
setInterval(ajaxCall,30000) 
</script> 

因爲我不知道該如何處理app.get(「/」)和阿賈克斯的要求,我

Error: Can't set headers after they are sent. 

因爲我試圖發送數據進行兩次

我應該如何修改代碼,這樣我可以看到我數據在'http://localhost:3000/'上顯示,每30秒更新一次?

謝謝。

回答

1

Can't set headers after they are sent通常表示您對請求做出兩次迴應

你不能那樣做。

對於每個request/req應該只有一個response/res

app.get('/', function(req, res) { 
    // you respond to the request here 
    res.sendFile('./index.html',{root: __dirname}); 
    // and you respond again here 
    res.send(data) 
}); 

,如果你想sendFile() OR send(data)該端點決定。

從你的代碼來看,你可能希望創建另一個終點,你的AJAX調用,它確實後者

// serve your index 
app.get('/', function(req, res) { 
    res.sendFile('./index.html',{root: __dirname}) 
}); 

// serve your data 
// Your AJAX call should hit this endpoint instead 
app.get('/data', function(req, res) { 
    var data = 'lorem ipsum dolor'; 
    res.send(data); 
}); 
+0

謝謝,我知道這是一個問題。如果我想發送數據並刪除sendFile(),我的網頁每次刷新時都會更新,但setInterval函數永遠不會被調用。 – Deidara

+0

我已經更新了答案 –

+0

非常感謝... – Deidara

0

像尼古拉斯Kyriakides說打,你需要定義如下:

// serve your index 
app.get('/', function(req, res){ 
    res.sendFile('./index.html',{root: __dirname}) 
}); 

// serve your data 
// Your AJAX call should hit this endpoint instead 
app.get('/data', function(req, res) { 
var data = "lorem ipsum dolor"; 
    res.send(data); 
}); 

然後,你需要改變你的AJAX調用:

<script> 
function ajaxCall(){ 
    $.ajax({url: "http://localhost:3000/data", success: function(result){ 
    //do whatever you want with the returned data (in result) 
    //f.e. to update something on your web page, you want something like: 
    document.getElementById("idOfElementYouWantChanged").innerHTML = result; 
    }}) 

} 
setInterval(ajaxCall,30000) 
</script> 
+0

除了獲得一些神奇的互聯網點,它有什麼好做的公然複製/粘貼我的答案? –

+0

當我看到你的回答時,我已經在回答,看起來他仍然不理解這個概念,所以我想給他一個完整的例子。如果我傷害了你的「神奇互聯網點」感覺,我很抱歉。我只是在這裏幫忙。 – Hijliche

+0

獲得真實....... –

相關問題