簡體   English   中英

“ req”和“ res”來自哪里?

[英]Where are the `req` and `res` coming from?

注意:這個問題幾乎沒有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 layer定義了一個函數,或者將其定義為具有特定命名約定的module_hook ,但是參數卻無處不在,並且在這些魔術變量中有可預測的數據結構(在手冊中指定)。

那么這種技術叫什么,以及它如何工作。 我聽說過Dependency Injection ...是嗎? 如果是,您能否用n00b術語來解釋它是如何完成的?

這特別令人困惑,因為我從一開始就在過程中進行了編碼,並且我們始終知道變量來自何處以及如何調用函數...

該框架為您構造對象,並將其傳遞給您的回調。

NB reqres只是參數名稱; 你可以打電話給他們spameggs ,或者hocuspocus ,所有它的問題。

實際上, request是什么意思? 它是從哪里提供的?

每當您要訪問網站時,都在使用特殊協議,即超文本傳輸​​協議(HTTP) 該協議主要使用兩件事:

  1. 來自客戶端的問題,例如“您的服務器上是什么?” 要求
  2. 來自服務器的答案,例如“這是一個text / 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);
    }
}

實習生例子

甚至更簡單:想想一個實習生,他正在建築物中盤旋。 他是事件循環。 現在,在您的服務器機房中,有人告訴他應該將每個請求都帶給他們。 他寫下來,繼續他的無休止之旅。

然后有人站在大樓前,想查詢他的銀行帳戶。 他只是簡單地將一個請求扔到一個郵箱中,然后實習生趕到服務器室,並告訴技術人員已經請求了特定的站點,並向他們提供了必要的信息。 但是,他需要等待他們的答復,因為他們的答復不在他的清單上。

技術人員檢查該請求並發現用戶不符合給定的請求(*)。 他們准備一條錯誤消息,並將其提供給實習生。 現在,他返回建築物的前面,將錯誤消息提供給第一個客戶端,並准備好接收其他消息。

(*):此時,他們可能需要檢查數據庫中的某些內容,這可能需要一些時間。 他們可以告訴實習生稍后再回來,如果他們准備好了,可以打電話給他。 在這種情況下,實習生可以繼續他的方式,直到技術人員准備好為止。

您正在將該函數傳遞給.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);
});

它們是“請求”和“響應”的縮寫。 在許多Web框架中,典型的是將這兩個對象傳遞到請求處理方法(操作或您要調用的任何方法)中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM