2015-06-30 4 views
2

Я новичок в JavaScript и стараюсь научить себя использованию кода, размещенного в Интернете. Я не уверен в том, как аргументы передаются в различные функции на разных уровнях.Аргументы функции в файле node.js 'Hello World

Например, в примере node.js «Hello World» (воспроизведено ниже), откуда берутся переменные «req» и ​​«res», и как клиент вызывает сервер и передает ему эту информацию (и получить результат)!?!

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 
console.log('Server running at http://127.0.0.1:1337/'); 
+1

* req * и * res * являются формальными параметрами функции expression 'function (req, res) {. ..} ', который передается * createServer *. Они являются эффективными локальными переменными функции. * createServer * вызывается функцией, передавая значения этим переменным, которые используются функцией, например. 'res.writeHead (...)' использует значение, переданное в * res * (надеюсь, объект с методом * writeHead *). – RobG

+0

Когда вы вызываете «http.createServer», вы передаете анонимную функцию, которая будет использоваться методом «createServer». Ядро узла имеет сложную задачу, управление соединениями и создание объектов «запроса» и «ответа», которые вы используете в своей анонимной функции. –

+0

Привет, люди, Спасибо, что ответили. Я считаю, что получаю то, что res и req находятся внутри самого определения функции. Сложный бит заключается в том, что функция, не имеющая имени (анонимного), вложенного внутри другой функции (или метода), вызывается из другого места и возвращает информацию в это место вызова. – neil

ответ

2

Это просто функция тела, которая передается методу createServer. Переменные req и res не существуют, поскольку они не являются переменными, они являются параметрами функции, и эти имена обычно используются для удобства чтения, но никоим образом не являются обязательными - например, код будет работать одинаково, если вы это сделали:

http.createServer(function (a, b) { 
    b.writeHead(200, {'Content-Type': 'text/plain'}); 
    b.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

вы знаете, так же, как при определении функции:

function someFunction(firstParam, secondParam) { 
    // do something with firstParam and secondParam 
} 

Но я не знаю, как функция без имени (анонимно) вложен в другой функции (или м этад) вызывается из другого места.

Смотрите, если это поможет вам понять:

function add(a,b){return a+b} 
 
function sub(a,b){return a-b} 
 

 
function math(f, x, y) { 
 
    alert(f(x, y)); 
 
} 
 

 
math(add, 1, 2); 
 
math(sub, 8, 4); 
 
// pass in anon function - multiplication 
 
math(function(a, b){return a * b}, 2, 5);

+0

Hey Shomz, Спасибо, что ответили. Сама часть функции достаточно ясна. Но я не уверен, как функция из имени (анонимного), вложенного внутри другой функции (или метода), вызывается из другого места. – neil

+0

Эй, добро пожаловать! Я обновил свой ответ, чтобы помочь вам понять это. Btw. не знаете, почему вы приняли ответ, который подсказывает, как работает createServer, вместо ответа на ваш вопрос о передаче функций. – Shomz

+0

Эй, Спасибо ... это делает вещи очень ясными. Что касается принятия другого ответа, я умоляю об этом. Принял его в спешке и не знал, что смогу отменить его. – neil

1

Req -> Http (https) Запрос объекта. Вы можете получить запрос запроса, параметры, тело, заголовки и файлы cookie. Вы можете переписать любое значение или добавить что-нибудь там. Однако перезапись заголовков или файлов cookie не повлияет на вывод обратно в браузер.

Res -> Http (https) Response Object. Ответ на клиентский браузер. Вы можете добавить новое значение cookie и написать в браузере клиента (в соответствии с правилами перекрестных доменов) После того, как вы выполните res.send() или res.redirect() или res.render(), вы не сможете сделать это снова, в противном случае, будет нечеткая ошибка.

req = { 
    _startTime  : Date, 
    app   : function(req,res){}, 
    body   : {}, 
    client   : Socket, 
    complete  : Boolean, 
    connection  : Socket, 
    cookies  :  {}, 
    files   :  {}, 
    headers  : {}, 
    httpVersion : String, 
    httpVersionMajor : Number, 
    httpVersionMinor :  Number, 
    method   : String, // e.g. GET POST PUT DELETE 
    next   : function next(err){}, 
    originalUrl : String,  /* e.g. /erer?param1=23¶m2=45 */ 
    params   : [], 
    query   : {}, 
    readable  : Boolean, 
    res   : ServerResponse, 
    route   : Route, 
    signedCookies : {}, 
    socket   : Socket, 
    url   : String /*e.g. /erer?param1=23¶m2=45 */ 
} 

res = { 
    app   : function(req, res) {}, 
    chunkedEncoding: Boolean, 
    connection  :  Socket, 
    finished  : Boolean, 
    output   : [], 
    outputEncodings: [], 
    req   : IncomingMessage, 
    sendDate  : Boolean, 
    shouldkeepAlive : Boolean, 
    socket   :  Socket, 
    useChunkedEncdoingByDefault : Boolean, 
    viewCallbacks : [], 
    writable  :  Boolean 
} 
1

Посмотрите в документации. Они помогают: https://nodejs.org/api/http.html#http_http_createserver_requestlistener

http.createServer создает экземпляр http.Server. http.Server - это эмитент событий, который может испускать несколько событий, включая «запрос».

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

Итак, вы создаете экземпляр http.Server, который испускает события и вызывает функции в ответ на эти события. Предположим, что ваш экземпляр http.Сервер http_server

Под капотом, http_server вероятно, делает что-то вроде:

http_server.on('request', [yourFunction]) 

Node неявно посылает REQ и Рез в вашу функцию. Поэтому каждый раз, когда клиент делает запрос на ваш сервер, он выдает событие «запрос». Затем, поскольку [yourFunction] привязан к событию запроса, он вызывается с параметрами req и res, переданными в.