req和res从哪里来?

注意:这个问题很less有jQuery,Drupal或node.js,它更像是一个关于“如何实现X的框架”的通用问题,其中X是我提到的任何一个框架所提供的。

我看到了一个如下所示的node.js代码示例:

 var http = require('http');
 var server = http.createServer();
 server.listen(8000);
 server.on('request',function(req,res){
     //在req和res这里做一些事情
 });

req和res来自哪里没有明显的地方。 事实上, 'request'是什么意思? 它从哪里提供?

我注意到jQuery .get()和.post()函数中有类似的东西,而且看起来没有我想要的那么多。 我甚至在Drupal中看到过这个; 一个函数被定义在theme layer或者作为一个具有特定命名约定的module_hook ,但是参数module_hook任何地方,并且在这些魔术variables中存在可预测的数据结构(在手册中指定)。

那么这个技术叫做什么,它是如何工作的。 我听说过Dependency Injection …是这个吗? 如果是这样,你能用n00b的术语来解释它是如何完成的吗?

这是特别令人困惑,因为我从程序开始编码,我们总是知道variables来自哪里以及如何调用一个函数…

实际上, request是什么意思? 它从哪里提供?

每当你想访问一个网站,你都使用一个特殊的协议, 超文本传输​​协议(HTTP) 。 这个协议主要使用两件事情:

  1. 来自客户端的问题,如“你的服务器上有什么? ( 请求
  2. 来自服务器的答案,如“它是一个文本/ HTML,长度是2000字节,这里是文档”( 响应 )。

这个请求 – 响应模型直接用在node.js中,因为你使用的服务器是一个HTTP服务器。

你可以用n00b的术语来解释它是如何完成的吗?

你知道主循环或事件循环是什么吗? 几乎每个GUI应用程序都有一个。 这基本上是这样一个循环:

 while(waitForNewEvent(&event)){ handleMsg(&event); } 

这个事件可以是任何东西,从键盘input到另一个软件,试图把你的窗口放在前面。 它也可以是“你准备好待命了吗?”。

node.js在它的服务器实现中使用这样一个事件循环。 server.on('request', callback)基本上告诉node.js你希望在请求到来时使用callback函数:

 while(waitForNewEvent(&event)){ if(event == "request"){ callback(request,&response); responseToClient(response); } } 

实习例子

或者更简单一点:想想一个实习生,他只是在一个build筑物里跑来跑去。 他是事件循环。 现在在你的服务器房间里,有人告诉他每一个请求都应该带给他们。 他写下来,继续他的永无止境的旅程。

然后有人站在大楼前,想检查他的银行账户。 他只是把一个请求投入邮箱,实习生冲到服务器房间,告诉技术人员已经请求了特定的地点,并给他们提供必要的信息。 然而,他需要等待他们的回应,因为他们的回应不在他的名单上。

技术人员检查请求并发现用户不符合给定的请求(*)。 他们准备一个错误消息,并把它交给实习生。 他现在返回到大楼前面,向第一个客户端发出错误消息,并准备好接收其他消息。

(*):此时他们可能需要检查数据库中的某些内容,这可能需要一些时间。 他们可以告诉实习生稍后回来,如果他们准备好了,就打电话给他。 在这种情况下,实习生可以继续他的方式,直到技术人员准备好。

框架为您构build对象,并将它们传递给您的callback。

NB reqres只是参数名称; 你可以把它们称为spameggs ,或者把它们称作是重点。

您正在将该函数传递给.on()函数。 事件发生时,一些内部代码会调用您传递的函数,并向其提供参数。

这是一个例子。 server对象有一个名为on的方法。 它需要一个namestring和一个callback函数。

它使用setTimeout等待一秒钟,然后调用它的callback。 当它调用它时,会传递给它的name ,以及一个静态消息"hi there"

  // Think of this as the internal Node code... var server = { // v---this will be the function you pass on: function(name, callback) { setTimeout(function() { callback(name, "hi there"); // here your function is invoked }, 1000); } }; 

所以在这里我们调用.on() ,并将它传递给名字"foo"callback函数。 当callback被调用时,将会给出name"hi there"消息。

  // ...and this is your code. server.on("foo", function(name, message) { console.log(name, message); }); 

它们是“请求”和“响应”的缩写。 将这两个对象传递给请求处理方法(动作或任何你想要调用它)是很多web框架的典型。