• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Node.js - przerwanie działania funkcji na serwerze na żądanie klienta

Object Storage Arubacloud
+1 głos
363 wizyt
pytanie zadane 8 lutego 2016 w JavaScript przez damianu90 Nowicjusz (180 p.)
Witam,

Zaimplementowałem funkcję do wyszukiwania w plikach, które zawierają frazę szukaną przez użytkownika. Funkcja zwraca lokalizację pliku oraz nagłówki dokumentów, w których znajduje się szukana fraza. Wyniki są zwracane w postaci JSON. Ten skrypt napisałem w Node.js, gdyż obsługuje pliki. Utworzyłem drugi projekt, stronę internetową z wyszukiwarką. Gdy użytkownik wpisze szukaną frazę to ta strona wysyła żądanie do serwera node.js, żeby wyszukał i oczekuje zwrócone wartości w postaci JSON. Wszystko działa ładnie tylko problem jest taki, że jak szukanie zbyt długo trwa i użytkownik może przerwać wyszukiwanie poprzez kliknięcie w link, ale nie wiem jak wysłać żądanie do serwera, żeby przerwał działanie wyszukiwarki bo mimo, że jak użytkownik przerwie działanie wyszukiwarki na stronie to ajaxowo przerwie się ale serwer node.js nadal pracuje.. Czy jest możliwe aby wysłać ządanie do serwera żeby przerwał działanie funkcji wyszukiwania ? Proszę o odpowiedź.

Pozdrawiam wszystkich!

1 odpowiedź

+1 głos
odpowiedź 8 lutego 2016 przez Comandeer Guru (601,930 p.)
wybrane 8 lutego 2016 przez damianu90
 
Najlepsza

Da się wykryć zakończenie połączenia przez event close, więc musiałbyś przerywać szukanie w handlerze tego zdarzenia. Więcej info: http://stackoverflow.com/questions/7348736/how-to-check-if-connection-was-aborted-in-node-js-server

komentarz 8 lutego 2016 przez damianu90 Nowicjusz (180 p.)

Dziękuję bardzo! Faktycznie to te zdarzenie close.

Tylko zastanawiam się jak przerwać funkcję rekurencyjną poprzez zdarzenie close? Chodzi o to, że zdarzenie close zostanie wykryte dopiero jak funkcja rekurencyjna kończy swoje działanie. Ale spróbowałem zrobić taki trik, że utworzyłem zmienną globalną np. searchCancel = false i dodałem do funkcji rekurencyjnej ifa o takiej postaci if (searchCancel == true) then return; żeby nie szukał już dalej i w zdarzeniu on close dałem searchCancel = true aby przerwać funkcje rekurencyjna. Jednak ten trik nie wyszedł mi, gdyż funkcja rekurencyjna widzi starą wartość czyli false jakby kopię w pamieci. Masz pomysł jak przerwać działanie funkcji rekurencyjnej w zdarzeniu Close ?

komentarz 8 lutego 2016 przez Comandeer Guru (601,930 p.)
Jeśli ta funkcja nie jest asynchroniczna, to raczej średnio da się ją przerwać w jej trakcie.
komentarz 8 lutego 2016 przez damianu90 Nowicjusz (180 p.)
edycja 10 lutego 2016 przez damianu90

Czyli bym musiał tą funkcję rekurencyjną przerobić na asynchroniczną?

 

Kod obsługi żądań mam taki:

var server = http.createServer(function (req, res) {

	var requestData = '';
	res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8383');
	
	req.connection.on('close',function(){    
		searchStopFromClient = true;
    });
	
	//je�li metoda HTTP to GET
	if (req.method === "GET") {
		
		res.writeHead(200, {'Content-Type': 'text/html'});
		res.end(pageHTML);
	}
	else if (req.method === "POST") {
		req.setEncoding('utf-8');
		req.on('data', function(data) {
			requestData += data;
		});
		
		req.on('end', function() {
			var postData = qs.parse(requestData);
			
			if (postData.hasOwnProperty('fileSearch') && postData.fileSearch != '') {
				searchOnFile(fs, postData.fileSearch, postData.frazeSearch);
			} else {
				searchFilesSync(fs, dir, postData.frazeSearch);
			}
				
			
			
			res.writeHead(200, {'Content-Type': 'text/html'});
			res.end(JSON.stringify(searchsRefData));
		});
	}
	
	searchStopFromClient = false;
});

server.listen(1338, 'localhost');
console.log('Server running at http://localhost:1338/');

A kod funkcji rekurencyjnej mam taki:

function searchFilesSync(fs, dir, fraze) {
	if (searchStopFromClient == true) {
              return;
        }
	var datas = fs.readdirSync(dir);
	var pos = -1;
	datas.forEach(function ( file ) {
		var stats = fs.statSync(dir + "/" + file);
		if (stats.isFile() && file.indexOf(".htm") > 0) {
				.....// jakis tam kod funkcji....

				
			} else if (stats.isDirectory()) {
				searchFilesSync(fs, dir + "/" + file, fraze);
			}
	});
}

Może coś byś więcej mi rozjaśnił ? Z góry dziękuję.

komentarz 8 lutego 2016 przez Comandeer Guru (601,930 p.)

W aplikacjach sieciowych w node.js NIE UŻYWA się funkcji z sync w nazwie, bo to blokuje serwer. Jeśli serwer obsługuje takie wyszukiwanie, to przez czas jego trwania nikt inny się nawet nie połączy z serwerem.

Dlatego zastąp wszystkie funkcje synchroniczne (np. fs.statSync) ich asynchronicznymi odpowiednikami (np. fs.stat). To oznacza, że – niestety – musisz się zaprzyjaźnić z callbackami.

Ta zmiana, choć niełatwa, powinna rozwiązać problem. Jeśli nie, to otocz rekurencyjne wywołanie dodatkowo setImmediate, co wymusi asynchroniczność.

Podobne pytania

0 głosów
1 odpowiedź 229 wizyt
pytanie zadane 6 lutego 2020 w JavaScript przez mreo Użytkownik (790 p.)
0 głosów
0 odpowiedzi 248 wizyt
0 głosów
1 odpowiedź 788 wizyt
pytanie zadane 21 lutego 2017 w JavaScript przez Zainteresowany Nowicjusz (240 p.)

92,617 zapytań

141,467 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...