【问题标题】:Where are the `req` and `res` coming from?`req` 和 `res` 来自哪里?
【发布时间】:2012-11-20 13:22:51
【问题描述】:

注意:这个问题几乎没有 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 layermodule_hook 中定义,我有特定的命名约定,但参数突然出现,并且在这些魔术变量中存在可预测的数据结构(在手册中指定)。

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

这特别令人困惑,因为我从一开始就在程序中编码,而且我们总是知道变量来自哪里以及函数是如何被调用的......

【问题讨论】:

  • 您将函数传递给 .on() 函数。当事件发生时,一些内部代码会调用您传递的函数,并为其提供参数。
  • 这和jQuery有什么关系?
  • @Derek 或 oopdrupal,就此而言

标签: javascript node.js


【解决方案1】:

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

注意 reqres 只是参数名称;你可以叫他们spameggs,或者hocuspocus,不管怎样。

【讨论】:

  • 它们很可能是requestresponse 对象。
【解决方案2】:

您将函数传递给.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】:

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

    【讨论】:

      【解决方案4】:

      其实request是什么意思?它是从哪里供应的?

      每当您想访问一个网站时,您都在使用一种特殊的协议,hypertext transfer protocol (HTTP)。这个协议主要用到了两个东西:

      1. 来自客户端的问题,例如“您的服务器上 / 是什么?” (请求
      2. 来自服务器的回答,例如“它是文本/html,长度为 2000 字节,这是文档”(响应)。

      这种请求-响应模型直接在 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);
          }
      }
      

      实习示例

      或者更简单:想想一个实习生,他只是在大楼里转圈子。他是事件循环。现在在你的服务器机房里,有人告诉他每个请求都应该提交给他们。他把这件事写下来,并继续他永无止境的旅行。

      然后有人站在大楼前想查看他的银行账户。他只需将请求放入邮箱,实习生就会冲到服务器机房,告诉技术人员特定站点已被请求,并为他们提供必要的信息。不过,他需要等待他们的回复,因为他们的回复不在他的名单上。

      技术人员检查请求并发现用户不符合给定请求的资格 (*)。他们准备了一条错误消息并将其提供给实习生。他现在回到大楼前面,将错误消息提供给第一个客户,并准备好接收其他消息。

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

      【讨论】:

      • 是的,正是……我的问题是“在 GUI 应用程序中,event 来自哪里”?我猜这是框架所做的事情......
      • @adityamenon:是的,它部分由框架完成。例如,httpServer 基本上是一个等待传入连接的 TCP 服务器。当传入连接被识别为 HTTP 请求时,将调用on 中给出的回调。另一方面,框架仅允许您检查框架或您提供的那些事件,例如如果您使用鼠标输入,node.js 不会触发事件。
      猜你喜欢
      • 1970-01-01
      • 2021-02-18
      • 2010-09-21
      • 2022-12-11
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多