2017-06-01 79 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 
    } 
});