![](/img/trans.png)
[英]Respond from method in controller without req, res from Express
[英]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 req
和res
只是參數名稱; 你可以打電話給他們spam
和eggs
,或者hocus
和pocus
,所有它的問題。
實際上,
request
是什么意思? 它是從哪里提供的?
每當您要訪問網站時,都在使用特殊協議,即超文本傳輸協議(HTTP) 。 該協議主要使用兩件事:
該請求-響應模型直接在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.