Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Тормозит простяцкий пример сервера на Node.js (https://javascript.ru/forum/node-js-io-js/50740-tormozit-prostyackijj-primer-servera-na-node-js.html)

kyb 09.10.2014 13:38

Тормозит простяцкий пример сервера на Node.js
 
В книге Пауэрс "Изучаем Node.js" листинг 1.4:
var http = require('http');
var fs = require('fs');

var counter = 0;

/// запись чисел
function writeNums(res) {
	//var counter = 0;

	/// глобальное приращение значения, запись для клиента
	for( i=0; i<100; i++) {
		counter++;
		res.write(counter.toString() + '\n');
	}
}

http.createServer( function(req, res) {

	var querry = require('url').parse(req.url).query;
	var app = require('querystring').parse(querry).file + ".txt";
	//console.log('app: ' + app);

	/// заголовок контента
	res.writeHead(200, {'content-type': 'text/plain'});
	/// запись чисел
	writeNums(res);

	/// установка таймера на открытие файла и чтение его контента
	setTimeout( function() {
		console.log('opening ' + app);
		/// открытие файла и чтение содержимого
		fs.readFile(app, 'utf8', function(err, data) {
			if (err)
				res.write('Could not find or open file for reading.\n');
			else
				res.write(data);
			res.end;
		})
	}, 2000)
}).listen(8888);

console.log('Listening on 8888.')


Вводим в браузер http://localhost:8888/?file=main
Очень долго думает браузер, почти несколько минут. Потом выдает числа от 1 до 100 и содержимое файла main.txt (как ожидалось). Без SetTimeout и записи чисел всё работает мгновенно.
Полагаю проблема в коде и асинхронности Node. В книге об этом ничего.

Sweet 09.10.2014 14:07

В 37-й строчке нужно вызывать метод:
res.end();

kyb 09.10.2014 14:51

( Да уж. Java и Си такое не допустили бы.
Посоветуйте средство, которое выдавало бы warning'и.

ruslan_mart 09.10.2014 15:49

kyb, так тут нет по сути никакой ошибки. Вы просто получили сам метод, но не вызвали его.

Sweet 09.10.2014 16:10

Цитата:

Сообщение от Ruslan_xDD
так тут нет по сути никакой ошибки. Вы просто получили сам метод, но не вызвали его.

На самом деле, тут очевидно что-то не так, поскольку это не геттер, и эта функция никуда не передаётся и не присваивается. Например, phpStorm выдаёт в таком случае warning "Expression statement is not assignment or call".

kyb 14.10.2014 16:11

Я так понял js ошибки выдает только в исключительнейших ситуациях. Никакой строгой типизации, что кому хошь, то и присваивай, или строку с числом и с булем сравнивай, или безтолковые действия делай, типа получил сам метод и никуда не дел его. По-моему это не очень правильно.
Цитата:

так тут нет по сути никакой ошибки. Вы просто получили сам метод, но не вызвали его.
Может для js и нет а для моей "бузнесс-логики" очень даже ошибка.

tsigel 14.10.2014 16:21

kyb,
Попробуйте пользовать TypeScript, может поможет :)

Erolast 14.10.2014 16:42

Цитата:

( Да уж. Java и Си такое не допустили бы.
Уверен?


Часовой пояс GMT +3, время: 12:58.