2017-06-01 81 views
1

使用nodejs和express我試圖觸發一個包含簡單控制檯日誌的js函數。可悲的是,該函數僅觸發6次並凍結了一段時間。一兩分鐘後,所有在「凍結時間」點擊的按鈕點擊一次觸發。它總是在按下按鈕6次後發生。Nodejs,express,Ajax:函數僅觸發六次

的index.html - >按鈕
客戶端 - > jQuery函數觸發一個Ajax後功能
server.js - >包含明確的功能觸發控制檯日誌

的index.html

<input type="button" id="car" value="drive"/> 

clientside.js

$('#car').click(function(){ 

    $.ajax({ 
     type:'POST', 
     url: url + '/drive' 
    }); 

}); 

server.js

var app = express(); 

app.post('/drive', function(req, res){ 

    console.log('Car starts driving'); 

}); 

我在做什麼錯?任何提示如何我可以改善我的代碼?

謝謝

+2

這可能是因爲你的服務器沒有響應。你有沒有機會在Chrome中測試它? Chrome將允許6個併發請求到主機名。所以在6之後,瀏覽器會阻止你提出更多請求。在你的server.js文件中,試着在'console.log(...)'行後面調用'res.send(200)'。 – dan

+0

在你的server.js模塊中,確保你返回。如res.send('汽車開始駕駛') –

+0

在你的客戶端。js,最好的做法是在點擊後禁用按鈕,然後在Ajax調用中啓用它,要麼成功或失敗 –

回答

3

您的服務器需要響應請求。嘗試將服務器更新爲:

var app = express(); 

app.post('/drive', function(req, res){ 

    console.log('Car starts driving'); 
    res.sendStatus(200) 

}); 

這將對所有請求返回200 OK。

爲什麼在6次請求後會發生這種情況?我猜你正在使用Chrome或Firefox。 Chrome和Firefox將只允許向單個服務器發送最多6個併發請求。一旦你達到6,瀏覽器將排隊剩餘的請求。

你看到它在一段時間後自行修復的原因是由於請求超時。一旦請求超時(因爲它沒有收到響應),瀏覽器將關閉連接。每個主機限制

瀏覽器併發請求 - https://stackoverflow.com/a/985704/4774345

+0

很好的回答和解釋!如果沒有想法chrome在6停止了所有傳出的請求。 – JonLuca

+0

這解決了它。謝謝。爲了說清楚:Chrome只允許6個併發請求,但在我的服務器響應後,這個數字再次下降到0,我是對嗎? – Preprocezzor

+0

@Preprocezzor是的。每次您的服務器響應請求時,瀏覽器都會關閉與服務器的連接。 – dan

1
$('#car').click(function(){ 

    $.ajax({ 
     type:'POST', 
     async : true, 
     url: url + '/drive' 
    }); 

你需要異步發送。

2

服務器代碼應該返回聲明:

app.post('/drive', function(req, res){ 
    console.log('Car starts driving'); 
    res.sendStatus(sendStatus) 
}); 

sendStatus details

良好做法是點擊後禁用按鈕,然後後啓用響應回來:

//禁用按鈕

$.ajax({ 
    url: url + '/drive'   
    type: 'POST',   
    data: {}, 
    success: function(data){ 
     //Enable button 
    }, 
    error: function(data){ 
     //Enable button 
    } 
});