Javascript node.js的Hello World示例中的函数参数
我是JavaScript新手,正在尝试使用在线发布的代码自学。我不确定参数在不同级别传递到不同函数的方式 例如,在下面重现的node.js Hello World示例中,“req”和“res”变量来自何处?客户端如何调用服务器并将此信息传递给服务器并获得结果Javascript node.js的Hello World示例中的函数参数,javascript,node.js,function,parameter-passing,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'})
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请求对象。 您可以从中获取请求查询、参数、正文、标题和cookie。 您可以覆盖任何值或在其中添加任何内容。 但是,覆盖标题或cookie不会影响返回浏览器的输出 Res->httphttps响应对象。 将响应返回到客户端浏览器。 您可以根据跨域规则将新的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方法的函数体。变量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
}
但我不确定如何从其他地方调用嵌套在另一个函数或方法中的匿名函数
看看这是否有助于您理解:
函数adda,b{返回a+b}
函数suba,b{返回a-b}
函数mathf,x,y{
alertfx,y;
}
mathadd,1,2;
mathsub,8,4;
//传入一个函数-乘法
mathfunctiona,b{返回a*b},2,5 看看这些文件。它们有助于: http.createServer正在创建http.Server的实例。服务器是一个事件发射器,它可以发出多个事件,包括请求 作为参数传入的函数是RequestListener。 您要传递的函数是绑定到请求事件的requestListener 因此,您正在创建一个http.Server实例,它发出事件并调用函数来响应这些事件。假设您的http.Server实例是http\u服务器 在引擎盖下面,http_服务器可能会执行以下操作:
http_server.on('request', [yourFunction])
节点隐式地将req和res发送到函数中。因此,每次客户端向服务器发出请求时,它都会发出请求事件。然后,由于[yourFunction]绑定到请求事件,因此会使用传入的req和res参数调用它 req和res是传递给createServer的函数表达式函数req,res{…}的形式参数。它们实际上是函数的局部变量。然后createServer将调用该函数,将值传递给该函数使用的变量,例如res.writeHead。。。使用通过writeHead方法传递给对象的值。调用http.createServer时,传递的是将由方法createServer使用的匿名函数。节点的核心任务是管理连接,创建用于匿名功能的请求和响应对象。大家好,谢谢回答。我相信我得到了函数定义本身中的res和req。棘手的一点是如何从其他地方调用嵌套在另一个函数或方法中的匿名函数,并将信息返回到调用位置。嘿,Shomz,谢谢你的回答。功能部分本身非常清楚。但我不确定嵌套在另一个函数或方法中的匿名函数是如何从其他地方调用的。嘿,不客气!我已经更新了我的答案来帮助你理解这一点。顺便说一句,我不知道你为什么接受这个提示createServer如何工作的答案,而不是回答你关于传递函数的问题。嘿,谢谢。。。这使事情非常清楚。至于接受另一个答案,我认为没有必要。匆忙接受了它,不知道我能撤销它。哈哈,不用担心,我很高兴我能帮上忙。欢迎来到SO