2013-04-14 65 views
4

使用Node.js的Hello World示例:試圖理解節點createServer回調

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 
console.log('Server running at http://127.0.0.1:1337/'); 

我試圖尋找到內http.js createServer「查找」功能,然後將其傳遞兩個對象( 。這上面命名爲「REQ」和「水庫」我已經通過http.js搜索,我發現的唯一的事情是:

exports.createServer = function(requestListener) { 
    return new Server(requestListener); 
}; 

這是否意味着匿名函數:

function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
} 

...作爲 'requestListener' 和...

return new Server(requestListener); 

...是哪裏REQ和RES對象獲得通過回傳給?

+1

其實'當「請求」事件在服務器對象上發出requestListener'被調用。見.emit('request''的'位置附近['的2017年http.js'線(https://github.com/joyent/node/blob/master/lib/http.js#L2017) –

+0

@丹D.這是否意味着發射經過REQ和RES匿名功能,當服務器收到請求 – JohnGalt

+1

是,通過EventEmitter模式作爲服務器構造有'this.addListener(「請求」,requestListener)?。 '.emit'路由'.emit('request',req,res);'internal' .emit'在這種情況下使用偵聽器列表來處理事件'request',並且相當於調用聽衆傳遞的參數。 –

回答

1

是。在Javascript函數本身是可以分配給「對象」的「值」。由於您可以將對象傳遞給另一個函數,因此您可以將函數本身作爲對象傳遞。

requestListener是被用來調用Serverconstructor它命名爲requestListener參數createServer

你也可以看到這一點紅寶石,在那裏你可以調用一個函數,並在同一時間通過它在做塊要執行的代碼,作爲參數。