Глупый вопрос по Node js
В книгах написано, что сервер создается вызовом метода createServer()
var http = require("http"); http.createServer().listen(3000); Для обработки событий, в вышеуказанный метод передается функция http.createServer(function(request, response){ }); параметрами которой в свою очередь служат два объекта reqest и response. Вопрос: как эти параметры попадают в функцию? |
В смысле "как попадают"? Внутри "http.createServer" вызывается переданный Вами callback и в него передаются параметры.
var my = function(callback) { callback(123, 456); }; my(function(a, b) { console.log(a, b); }); |
Если я правильно понимаю,то вы в функции
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 функции? |
|
Примерно вот так попадают.
Не знаю, как там внутри выглядить нативный модуль 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 в консоль - будем считать это ответом сервера. Гы! (извините, это я попробовал, как тут с кодом сообщения пейсать - щас погляжу, что вышло) |
Хе! Наверное, мне надо было добавить - "да и незачем это знать".
Тем более что из взятого вне контекста, одно этого модуля - ничего не понятно по существу сабжа. |
Спасибо, Кэп.
|
Хосподи, ну давай я без класса то же самое напейшу, и без стрелочек:
function Http(req, res) { this.req = req; this.res = res; } Http.prototype.createServer = function(func) { func(this.req, this.res); }; var http = new Http({ url: '/' }, { write: function(s) {console.log(s);} }); module.exports = http; И ещё модуль экспортирую, разделю на два файла (чтоб было попохожее), положу его рядом и назову http.js, и основной тогда будет такой: var http = require('./http'); http.createServer(function(req, res) { if(req.url == '/') res.write('Hello, World!'); }); И ты не поверишь, но результат будет тот же. |
Кому посмотреть, зачем посмотреть?
У человека был нормальный, хороший вопрос - как в колбэк попадают параметры запроса и ответа? Поскольку мне, старику, делать нечего, то я и подумал - это ж какой-то не сложный механизм? Ну и попытался сам принцип изобразить (заодним приучая себя к новому "сахарному" синтаксису моего почти любимого языка). И потом, я же не "профессор", я сам на старости лет эту науку только осваиваю (не совсем понятно, за каким хером, - в этой стране нужны только программисты PHP и 1С, а про Ноду тут никто почти и не знает). А существо принципа заключается в повсеместном использовании в javascript анонимных функций и анонимных объектов. И это же касается не только объектов запроса и ответа, а параметров вообще всех колбэков, "лапша" из которых так пугает PHP-шников и прочих всяких явистов. Короче, это "былинная земля под названием Лямбда Окраинная". |
Часовой пояс GMT +3, время: 04:51. |