node.js'Hello World示例中的函数参数

时间:2015-06-30 22:17:03

标签: javascript node.js function parameter-passing

我是JavaScript的新手,我正在尝试使用在线发布的代码来教自己。我不确定参数在各个级别传递给各种函数的方式。

例如,在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/');

3 个答案:

答案 0 :(得分:2)

它只是传递给createServer方法的函数体。变量reqres不存在,因为它们不是变量,它们是函数参数,这些名称通常用于可读性,但绝不是必须的 - 例如,如果您这样做,代码将起作用:

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);




答案 1 :(得分:1)

请求 - > Http(https)请求对象。 您可以从中获取请求查询,参数,正文,标题和Cookie。 您可以覆盖任何值或在那里添加任何内容。 但是,覆盖标头或cookie不会影响输出回浏览器。

Res - > Http(https)响应对象。 响应回客户端浏览器。 您可以添加新的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
}

答案 2 :(得分:1)

看看文档。他们帮助:https://nodejs.org/api/http.html#http_http_createserver_requestlistener

http.createServer正在创建一个http.Server实例。 http.Server是一个事件发射器,可以发出多个事件,包括“请求”。

作为参数传入的函数是RequestListener。 您传入的函数是requestListener,它绑定到“request”事件。

因此,您正在创建一个http.Server实例,它会发出事件并调用函数来响应这些事件。假设您的http.Server实例是http_server

在引擎盖下,http_server可能会执行以下操作:

file_put_contents("banner.php",$banner);

Node隐式地将req和res发送到您的函数中。因此,每次客户端向您的服务器发出请求时,它都会发出“请求”事件。然后,因为[yourFunction]绑定到请求事件,所以在传入req和res参数的情况下调用它。