Откуда приходит запрос и ответ, и как я мог узнать?

Я решил изучить Node, поэтому для начала я читаю Книгу Node для начинающих . Как и во многих других ресурсах, есть простой HTTP-сервер, первый шаг, что-то вроде:

var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
}).listen(8888);

Насколько я понимаю, когда кто-то, в данном случае я, localhost:8888, делает запрос, запускается событие, и анонимная функция, которая была передана http.createServer, срабатывает. Я помещаю здесь документацию, которую мне удалось найти о http.createserver для всех, кто найдет ее полезной:

http.createServer([requestListener])

Возвращает новый объект веб-сервера.

RequestListener — это функция, которая автоматически добавляется к событию «запрос».

(с сайта node.js)

Я не мог найти или выяснить, как эта триггерная функция передает свои параметры и как мне узнать об этом. Итак... как мне узнать, откуда берутся эти параметры, какие методы они предлагают и т. д.?

Заранее спасибо!


person ferhtgoldaraz    schedule 05.12.2013    source источник
comment
http://nodejs.org/api/http.html#http_http_createserver_requestlistener event: 'request' прямо под тем местом, где заканчивается эта ссылка. вверх. Он определяется самим node.js.   -  person Marc B    schedule 06.12.2013
comment
Документация Node.js не очень хороша, пока вы не познакомитесь с Node. Было много раз, когда я просто обращался к исходному коду, чтобы понять это. Однако, как только вы с ним ознакомитесь, это не так уж и плохо.   -  person Brad    schedule 06.12.2013
comment
Д'о. Как я мог потерять столько времени на поиски чего-то такого передо мной! Спасибо. Если вы сделаете это ответом, я приму его сразу. Вот еще одна ссылка на него, по-моему, более правильная.   -  person ferhtgoldaraz    schedule 06.12.2013
comment
Документы, упомянутые Марком Б., — это то, что нужно, но они часто немного тонкие. Напоминает мне справочные страницы тем, что они указывают правильное направление, но часто пренебрегают ключевой информацией. Или предположим, что вы знаете, что делаете :-) Я нахожу недорогие онлайн-книги Leanpub по Node также достаточно полезными.   -  person user949300    schedule 06.12.2013


Ответы (3)


В JavaScript функции можно передавать в методы в качестве параметра. Пример:

function funcA(data) {
    console.log(data);
}
function funcB(foo) {
    foo('I'm function B');    // Call 'foo' and pass a parameter into that function
}
funcB(funcA); // Pass funcA as a parameter into funcB

То, что вы делаете с http.createServer, описано выше, передавая функцию, которая может принимать параметры. новый сервер ожидает, что вы передадите функцию, которая он может звонить. Сервер выполнит внутренние действия, которые создадут объект запроса и ответа, а затем вызовут функцию, которую вы передали с этими переменными.

Подробнее об этих параметрах читайте в событии HTTP: запрос.

person matth    schedule 05.12.2013
comment
Это именно то, что я искал. - person ferhtgoldaraz; 06.12.2013

это должен быть стек создания: https://github.com/joyent/node/blob/master/lib/http.js#L62 > https://github.com/joyent/node/blob/master/lib/_http_server.js#L253, поэтому, если запрос запущен, это должно сработать: https://github.com/joyent/node/blob/master/lib/_http_server.js#L502 или, может быть, так: https://github.com/joyent/node/blob/master/lib/_http_server.js#L505

person floww    schedule 05.12.2013
comment
Может быть, я слишком нуб, но это все еще слишком загадочно для меня. - person ferhtgoldaraz; 06.12.2013
comment
Вы задавались вопросом, как ваша функция получает параметры? определенная вами функция передается в функцию createServer(), которая вызывает Server(), которая добавляет вашу функцию в качестве прослушивателя событий и вызывает ее в одной из двух последних связанных строк. и в этой точке вызова через self.emit('request', req, res) res и req передаются вашей функции в качестве параметров. - person floww; 06.12.2013
comment
Хорошо, но мне все равно не терпелось бы узнать, что такое req и res, хотя я тоже постараюсь прочитать источник, чтобы получить столь необходимую способность полностью понять его. Хотя теперь мне кажется, что я знаю, что они из себя представляют. - person ferhtgoldaraz; 06.12.2013

В документации по node.js объясняется почти все, что вам нужно знать о http://nodejs.org/api/http.html#http_class_http_clientrequest и http://nodejs.org/api/http.html#http_class_http_serverresponse, включая методы и события.

Если вам нужна информация о протоколе HTTP в целом, вы можете найти много ресурсов, погуглив их, например, HTTP-страница Википедии.

Если вы хотите подробно ознакомиться с тем, как HTTP реализован в узле, вам придется перейти к исходный код node.js.

Кроме того, вас может заинтересовать express.js, который является наиболее часто используемым веб-фреймворком для Node. ресурсов об этом доступны в Интернете.

person Aurélien Gasser    schedule 05.12.2013
comment
Спасибо, на самом деле я был немного дальше по книге, меня заинтересовал первый параметр, который, как я теперь считаю, является экземпляром http.IncomingMessage - person ferhtgoldaraz; 06.12.2013