저는 Node.js를 처음 접했고 그것이 어떻게 작동하는지보기 위해 일반적인 멍청한 일을하고 있습니다.
jQuery를 사용하여 로컬 노드 서버에 대한 간단한 AJAX GET 요청을 수행하는 버튼이있는 클라이언트 웹 페이지가 있습니다 (데이터는 관련이 없음). 여기서는 app.get()
모든 요청의 카운터 값이 콘솔에 기록됩니다. 성공한 요청 수를 확인할 수 있습니다.
버튼을 클릭하면, 예를 들어 1 초에 한 번씩 콘솔에 예상대로 카운터가 표시됩니다. 그러나 반복적으로 클릭하면 (초당 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
})
});
})
클라이언트는 클래스 button
가있는 요소 가있는 간단한 HTML 페이지입니다 .button
.
PC 사양 : Windows 7 Professional 32 비트, Intel Core 2 Quad CPU Q6600 2.40GHz, 4GB RAM (정말 오래된 시스템, 알고 있습니다).
질문은 왜 요청이 그렇게 제한됩니까? a) 내 컴퓨터, b) 잘못된 논리 접근 방식 또는 c) Express 또는 Node.js와 관련이 있습니까? 나는 이것이 Apache / PHP에서 일어나는 일을 기억하지 못한다.
여기서 진행되는 것은 특정 수량을 초과하면 브라우저가 요청을 대기열에 넣는 것입니다. 브라우저는 특정 도메인에 대한 동시 요청 수를 제한하고이를 초과하면 이전 요청이 반환 될 때까지 요청을 대기열에 넣습니다.
그리고 app.get()
카운터가있는 사용자 가 응답을 반환하지 않기 때문에 브라우저는 브라우저가 수행 한 처음 N 개의 요청이 완료 될 때까지 기다리지 않습니다. 결국 (몇 분 후) 시간이 초과되고 더 많은 요청을 보낼 수 있습니다.
나는 그것이하는 모든 일이 값을 기록하는 것이라면 이것이 서버의 문제라고 의심합니다.
응답을 보내면이 문제가 사라질 수 있습니다.
var c = 0; // counter
app.get('/mydatabase/endpoint', (req, res) => {
++c;
console.log(c);
res.send("" + c);
});
Express에서 핸들러를 정의한 모든 경로는 실제로 반환 할 항목이 없더라도 일종의 응답을 보내야합니다. 그렇지 않으면 발신자는 응답이 일어나기를 기다리며 일을 막을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다