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/69039-glupyjj-vopros-po-node-js.html)

Rora 25.05.2017 17:54

Глупый вопрос по Node js
 
В книгах написано, что сервер создается вызовом метода createServer()
var http = require("http");
 
http.createServer().listen(3000);

Для обработки событий, в вышеуказанный метод передается функция
http.createServer(function(request, response){
     
});

параметрами которой в свою очередь служат два объекта reqest и response.
Вопрос: как эти параметры попадают в функцию?

ruslan_mart 25.05.2017 18:37

В смысле "как попадают"? Внутри "http.createServer" вызывается переданный Вами callback и в него передаются параметры.

var my = function(callback) {
   callback(123, 456);
};


my(function(a, b) {
   console.log(a, b);
});

Rora 26.05.2017 17:18

Если я правильно понимаю,то вы в функции
var my = function(callback) {
   callback(123, 456); // вызов функции с аргументами
};

руками прописываете параметры callback функции описанной ниже.
my(function(a, b) {
   console.log(a, b);
});

Когда же мы создаем обьект сервера, мы не передаем аргументы руками. Reqest & responce как-то формируются Нодой, и передаются в метод http.createServer(), а точнее в его callback функцию:
http.createServer(function(request, response){
      
});


Если я все верно понял, то вопрос:
Как формируются эти обьекты reqest & responce, и благодаря чему они передаются как аргументы сallback функции?

nerv_ 27.05.2017 22:08

http://learn.javascript.ru/function-basics#параметры
http://learn.javascript.ru/custom-events#коллбэки

Audaxviator 30.05.2017 11:43

Примерно вот так попадают.
Не знаю, как там внутри выглядить нативный модуль http, но допустим, чисто схематически как-то так:

class Http {
	constructor(req, res) {
		this.req = req;
		this.res = res;
	}

	createServer(func) {
		func(this.req, this.res);
	}
}

const http = new Http({	url: '/' },
				      { write: (s) => console.log(s) });


И теперь пишем знакомые буквы:

http.createServer(function(req, res) {
	if(req.url == '/')
		res.write('Hello, World!');
});


Запущеный код пишет Hello World в консоль - будем считать это ответом сервера. Гы!
(извините, это я попробовал, как тут с кодом сообщения пейсать - щас погляжу, что вышло)

Rise 30.05.2017 18:50

Цитата:

Сообщение от Audaxviator (Сообщение 453822)
Не знаю, как там внутри выглядить нативный модуль http

http.js

Audaxviator 30.05.2017 19:48

Хе! Наверное, мне надо было добавить - "да и незачем это знать".
Тем более что из взятого вне контекста, одно этого модуля - ничего не понятно по существу сабжа.

Rise 30.05.2017 21:07

Цитата:

Сообщение от Audaxviator (Сообщение 453863)
Тем более что из взятого вне контекста, одно этого модуля - ничего не понятно по существу сабжа.

Так модули на то и модули, чтобы иметь зависимости (require) в виде других модулей, а не быть представлены все в одном месте, если проследуешь по цепочке зависимостей http -> _http_server -> net -> events, то окажешься в нужном тебе контексте, а именно events.js#L125.

Audaxviator 30.05.2017 21:09

Спасибо, Кэп.

Rise 30.05.2017 21:25

Audaxviator, как видишь класса там не наблюдается.


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