1

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

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

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

4

4 回答 4

5

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

注意 reqres只是参数名称;你可以称它们为spamand eggs,或hocusand pocus,这很重要。

于 2012-12-03T04:29:15.217 回答
4

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

每当您想访问一个网站时,您都在使用一种特殊的协议,即超文本传输​​协议 (HTTP)。该协议主要使用两件事:

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

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

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

你知道什么是主循环或事件循环吗?几乎每个 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);
    }
}

实习生例子

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

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

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

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

于 2012-12-03T04:59:13.977 回答
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);
});
于 2012-12-03T04:34:18.840 回答
1

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

于 2012-12-03T04:39:11.017 回答