我是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/');
答案 0 :(得分: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);

答案 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参数的情况下调用它。