`req`和`res`来自哪里?

时间:2012-12-03 04:26:53

标签: javascript node.js

注意:这个问题只有很少的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) {
    //do something with req and res here
});

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

我注意到jQuery .get()和.post()函数中的类似内容,查看源代码并没有像我想的那样多。我甚至看到过这个在Drupal中完成;函数在theme layermodule_hook中定义,具有我特定的命名约定,但参数在任何地方都显得无处可寻,并且在这些神奇变量中有一个可预测的数据结构(在手册中指定)。

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

这特别令人困惑,因为我从头开始编写程序,我们总是知道变量的来源以及函数的调用方式......

4 个答案:

答案 0 :(得分:5)

框架为您构造对象,并将它们传递给您的回调。

N.B。 reqres只是参数名称;您可以将它们称为spameggs,或hocuspocus,这一切都很重要。

答案 1 :(得分:4)

  

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

每当您想要访问网站时,您都使用特殊协议hypertext transfer protocol (HTTP)。该协议主要使用两件事:

  1. 来自客户的问题,例如"服务器上的/是什么?" (请求
  2. 来自服务器的答案,例如"它是一个text / html,长度是2000字节,这里是文档" (响应)。
  3. 此请求 - 响应模型直接在node.js中使用,因为您使用的服务器是HTTP服务器。

      

    [...]你能用n00b语言解释它是如何完成的吗?

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

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

    此事件可以是任何内容,从键盘输入到另一个试图将窗口置于前面的软件。它也可以是"你准备好待机吗?"。

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

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

    实习生示例

    甚至更简单:想想一个实习生,他只是在建筑物的圈子里跑来跑去。他是事件循环。现在,在你的服务器机房,有人告诉他应该把每个请求带给他们。他写下来并继续他永无止境的巡演。

    然后有人站在大楼前,想要检查他的银行账户。他只是将一个请求扔到一个邮箱中,然后实习生赶到服务器室并告诉技术人员已经请求了特定的站点并向他们提供了必要的信息。但是,他需要等待他们的回复,因为他们的回复不在他的名单上。

    技术人员检查请求并发现用户没有资格获得给定的请求(*)。他们准备一条错误信息并将其交给实习生。他现在返回到建筑物的前面,向第一个客户端发出错误消息,并准备好接收其他消息。

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

答案 2 :(得分:1)

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

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

它使用setTimeout等待一秒钟,然后再调用它给出的回调。当它调用它时,会向其传递提供的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);
});

答案 3 :(得分:1)

它们是“请求”和“响应”的缩写。许多Web框架通常将这两个对象传递给请求处理方法(操作或任何您想要调用的方法)。