重复的AJAX请求节点服务器限制(Express / jQuery)

时间:2016-08-17 21:33:23

标签: jquery ajax node.js mongodb express

我是Node.js的新手,我正在做通常的noob东西,看看它是如何工作的。

我有一个带有按钮的客户端网页,该按钮使用jQuery向本地节点服务器执行简单的AJAX GET请求(数据无关紧要),在tur中执行app.get(),其中计数器的值为每个请求都会记录到控制台,以便我可以看到有多少请求成功。

如果我点击按钮,比如说,每秒一次,控制台就会按照预期显示计数器。但是如果我反复点击它(假设每秒4或5次),服务器会在很晚的时候记录并在控制台上显示计数器,通常是几分钟,具体取决于点击次数。它限制了请求。

就实际制作而言,我打算制作的实际应用程序不太可能“滥用”这样的AJAX请求,但我当时认为这不是问题,我显然不能依赖于用户不要滥用按钮。

这是一个MWE,希望能够复制这个问题。

server.js

const express = require('express');
const MongoClient = require('mongodb').MongoClient
//const bodyParser= require('body-parser');
const app = express();
//app.use(bodyParser.urlencoded({extended: true}));
//app.use(express.static(__dirname + '/public'));

app.set('view engine', 'ejs');

var db;
var clientURL  = 'mongodb://127.0.0.1:27017/mydatabase'
var clientPort = 3000

MongoClient.connect(clientURL, (err, database) => {
  if (err) return console.log(err)
  db = database
  app.listen(clientPort, () => {
    console.log('Listening on '+clientPort)
  })
})

app.get('/', (req, res) => {
  res.render('client.ejs')
  })
})

var c = 0; // counter
app.get('/mydatabase/endpoint', (req, res) => {
  c = c + 1
  console.log(c)
})

scripts.js中

$(document).ready(function (){
    $(".button").on("click", function(){
        // AJAX GET
        $.ajax({
            url: "mydatabase/endpoint",
            type: "get",
            data: "..." // not imporant
        })
    });
})

客户端是一个简单的HTML页面,其button元素具有.button类。

PC规格:Windows 7专业版32位,英特尔酷睿2四核CPU Q6600 2.40GHz,4GB内存(我知道这是一个非常古老的系统)。

问题是为什么这样的请求会受到限制?是:a)我的机器,b)糟糕的逻辑方法,或c)与Express或Node.js有关的事情?我不记得发生过这种情况,比如Apache / PHP ......

1 个答案:

答案 0 :(得分:0)

我认为这里发生的事情是,一旦超过某个数量,浏览器就会对请求进行排队。浏览器限制它们将对任何特定域发出的同时请求的数量,当您超过该值时,它们会将请求排队,直到前一个请求返回。

并且,因为带有计数器的app.get()没有返回任何响应,浏览器会等待浏览器完成的前N个请求。最终(几分钟后),他们超时,然后它可以发送更多请求。

我很怀疑这是服务器的一个问题,如果它正在做的就是记录一个值。

您可以通过发送回复来消除此问题:

var c = 0; // counter
app.get('/mydatabase/endpoint', (req, res) => {
  ++c;
  console.log(c);
  res.send("" + c);
});

请记住,您在Express中定义处理程序的任何路由都应该发送某种响应,即使您没有任何实际返回的内容也是如此。否则,调用者只是坐在那里等待响应发生,它可能会堵塞事情。

相关问题