Problem z Long Polling w Node.js

0

Witam

Mam problem z implementacją techniki Long Polling. W poniższym przykładzie uploaduję 6 razy jakiś plik na serwer (myślę, że jest to zrozumiałe):

var fileCounter = 0;
for (var loop = 0; loop < 6; loop++) {
	var form = $submitFileForm[0];
	var data = new FormData(form);
	$.ajax({
		type: "POST",
		enctype: "multipart/form-data",
		url: "/uploads",
		data: data,
		processData: false,
		contentType: false,
		cache: false,
		timeout: 600000,
		success: function(data) {
			fileCounter++;
			if (fileCounter >= 6) {
				console.log("OK");
			}
		},
		error: function(error) {
			console.log("ERROR");
		}
	});
}

Teraz chciałbym, żeby serwer zwracał odpowiedź co 3 żądania (co 3 uploadowane pliki). Kod serwera w Node.js jaki znalazłem w Internecie:

app.post("/uploads", function(req, res) {
	requestCounter++;
	var room = "room_abc";
	responses[room].push(res);
	console.log(currentTime() + " - Otworzono nowe połączenie HTTP!");
	
	if (requestCounter % 3 == 0) {
        responses["room_abc"].forEach((res) => {
            upload(req, res, function(error) {
				if (error) {
					return res.end("ERROR");
				}
				res.end("OK");
				console.log("Upload OK");
			});
        });
		console.log(currentTime() + " - Zamknięto połączenie HTTP!");
    }
});

Niestety po wykonaniu aplikacji otrzymuję inne wyniki tzn. plik jest uploadowany aż 9 razy tak jak widać na poniższych screenshotach:
obraz 1 obraz 2

Jak powinienem zmienić kod aby otrzymać w konsoli wyniki jak poniżej:

09:45:16 - Serwer został uruchomiony na porcie 8080!
09:45:22 - Nawiązano połączenie z nowym klientem o ID oA13k0mCxbzQP4XWAAAA!
09:45:40 - Transfer pliku xxx w 6 żądaniach przy 3 żądaniach na połączenie
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Zamknięto połączenie HTTP!
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Otworzono nowe połączenie HTTP!
Upload OK
09:45:40 - Zamknięto połączenie HTTP!
09:45:40 - Transfer plików zakończony!

Z góry dziękuję za pomoc i pozdrawiam ;)

0

Czy wie ktoś dlaczego otrzymuję takie wyniki w konsoli? Na serwerze pojawia się więcej plików niż niosła ilość wykonanych żądań :/ Jestem prawie pewny, że błąd występuje po stronie serwera, a dokładnie w kodzie obsługującym Long Polling. Może ktoś ogarnie ten kod JS - uprościłem go na maxa:

app.post("/uploads", function(req, res) {
	requestCounter++;
	responses.push(res);
	if (requestCounter % numberOfRequestsPerConnection == 0) {
		responses.forEach((res) => {
			upload(req, res, function(error) {
				if (error) {
					return res.end("Error");
				}
				res.send();
				responses = [];
				requestCounter = 0;
				console.log(currentTime() + " - Pomyślnie odebrano plik");
			});
		});
	}
	res.end();
});

Oto zapis z konsoli Node.js:

D:\wshttpcompar>node index.js
21:22:55 - Serwer został uruchomiony na porcie 8080
21:23:13 - Zlecono transfer 2 kopii pliku xxx w 2 żądaniach/połączenie z wykorzystaniem protokołu HTTP
21:23:13 - Pomyślnie odebrano plik
21:23:13 - Pomyślnie odebrano plik
21:23:13 - Transfer danych zakończony
21:23:22 - Zlecono transfer 4 kopii pliku xxx w 4 żądaniach/połączenie z wykorzystaniem protokołu HTTP
21:23:22 - Pomyślnie odebrano plik
21:23:22 - Pomyślnie odebrano plik
21:23:22 - Pomyślnie odebrano plik
21:23:22 - Pomyślnie odebrano plik
21:23:22 - Transfer danych zakończony
21:23:33 - Zlecono transfer 8 kopii pliku xxx w 4 żądaniach/połączenie z wykorzystaniem protokołu HTTP
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Transfer danych zakończony
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:33 - Pomyślnie odebrano plik
21:23:49 - Zlecono transfer 9 kopii pliku xxx w 3 żądaniach/połączenie z wykorzystaniem protokołu HTTP
(node:8868) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added to [IncomingMessage]. Use emitter.setMaxListeners() to increase limit
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Transfer danych zakończony
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
21:23:49 - Pomyślnie odebrano plik
0

Rozwiązałem problem:

app.post("/uploads", function(req, res) {
	requestCounter++;
	responses.push(res);
	if (requestCounter % numberOfRequestsPerConnection == 0) {
		responses.forEach((res) => {
			upload(req, res, function(error) {
				if (error) {
					return res.end("Error");
				}
			});
			res.send();
			responses = [];
			requestCounter = 0;
			console.log(currentTime() + " - Pomyślnie odebrano i zapisano plik na serwerze");
		});
		res.end();
	}
});

1 użytkowników online, w tym zalogowanych: 0, gości: 1