25.05.2017, 17:54
|
Новичок на форуме
|
|
Регистрация: 09.05.2017
Сообщений: 6
|
|
Глупый вопрос по Node js
В книгах написано, что сервер создается вызовом метода createServer()
var http = require("http");
http.createServer().listen(3000);
Для обработки событий, в вышеуказанный метод передается функция
http.createServer(function(request, response){
});
параметрами которой в свою очередь служат два объекта reqest и response.
Вопрос: как эти параметры попадают в функцию?
|
|
25.05.2017, 18:37
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
В смысле "как попадают"? Внутри "http.createServer" вызывается переданный Вами callback и в него передаются параметры.
var my = function(callback) {
callback(123, 456);
};
my(function(a, b) {
console.log(a, b);
});
|
|
26.05.2017, 17:18
|
Новичок на форуме
|
|
Регистрация: 09.05.2017
Сообщений: 6
|
|
Если я правильно понимаю,то вы в функции
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 функции?
|
|
27.05.2017, 22:08
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
30.05.2017, 11:43
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Примерно вот так попадают.
Не знаю, как там внутри выглядить нативный модуль 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 в консоль - будем считать это ответом сервера. Гы!
(извините, это я попробовал, как тут с кодом сообщения пейсать - щас погляжу, что вышло)
Последний раз редактировалось Audaxviator, 30.05.2017 в 11:49.
|
|
30.05.2017, 19:48
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Хе! Наверное, мне надо было добавить - "да и незачем это знать".
Тем более что из взятого вне контекста, одно этого модуля - ничего не понятно по существу сабжа.
|
|
30.05.2017, 21:09
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Спасибо, Кэп.
|
|
30.05.2017, 21:50
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Хосподи, ну давай я без класса то же самое напейшу, и без стрелочек:
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!');
});
И ты не поверишь, но результат будет тот же.
Последний раз редактировалось Audaxviator, 30.05.2017 в 22:01.
|
|
30.05.2017, 22:53
|
Профессор
|
|
Регистрация: 28.04.2017
Сообщений: 214
|
|
Кому посмотреть, зачем посмотреть?
У человека был нормальный, хороший вопрос - как в колбэк попадают параметры запроса и ответа? Поскольку мне, старику, делать нечего, то я и подумал - это ж какой-то не сложный механизм? Ну и попытался сам принцип изобразить (заодним приучая себя к новому "сахарному" синтаксису моего почти любимого языка). И потом, я же не "профессор", я сам на старости лет эту науку только осваиваю (не совсем понятно, за каким хером, - в этой стране нужны только программисты PHP и 1С, а про Ноду тут никто почти и не знает).
А существо принципа заключается в повсеместном использовании в javascript анонимных функций и анонимных объектов. И это же касается не только объектов запроса и ответа, а параметров вообще всех колбэков, "лапша" из которых так пугает PHP-шников и прочих всяких явистов. Короче, это "былинная земля под названием Лямбда Окраинная".
|
|
|
|