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

Function arguments in node.js' Hello World example

我是 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/');

请求 -> Http (https) 请求 Object。 您可以从中获取请求查询、参数、body、headers 和 cookie。 您可以在那里覆盖任何值或添加任何内容。 但是,覆盖 headers 或 cookie 不会影响返回浏览器的输出。

Res -> Http (https) 响应 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
}

它只是一个传递给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
}

But I'm not sure how a function with no name (anonymous) nested inside another function (or method) is called from somewhere else.

看看这是否有助于您理解:

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

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

http.createServer 正在创建 http.Server 的实例。 http.Server是一个事件发射器,可以发射多个事件,包括"request."

您作为参数传入的函数是RequestListener。 您传入的函数是绑定到 "request" 事件的 requestListener。

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

在幕后,http_server 可能做了类似的事情:

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

Node 隐式地将 req 和 res 发送到您的函数中。因此,每次客户端向您的服务器发出请求时,它都会发出 "request" 事件。然后,由于 [yourFunction] 绑定到请求事件,它会使用传入的 req 和 res 参数进行调用。