2011-12-08 30 views
12

隨着快速/連接我可以設置中的任何一種格式的中間件功能:這是如何工作的?在快速使用可選的第一個參數(ERR,REQ,水庫,下一個)或(REQ,水庫,下一個)

function(req, res, next) // first argument will be a request 

或者

function(err, req, res, next) // first argument will be an error 

步進從快,連回,基本JavaScript的:我不明白,是這怎麼可能有一個可選的第一個參數

如何表達知道我的功能首先會接受一個err對象?我認爲使這種可能的結構必須如下:

function(req, res, next, err) 

我是否缺少一些基本的東西?有沒有可能查詢函數需要多少個參數?

編輯:感謝下面的答案。但中間件函數被傳遞來表示,所以arguments變量無效。雖然length是正確的......我想我已經找到了答案,很高興能確認是否屬於這種情況。示例如下:

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 
+0

我總是想,如果有可能還是不行,那麼相信自己,它不是! –

回答

9

我想我已經想通了,將是很好的有確認這是否是這種情況

var fn; 

fn = function (one, two) {}; 
console.log(fn.length); // 2 

fn = function (one, two, three) {}; 
console.log(fn.length); // 3 

是的,這是正確的。 Function實例的length屬性是它具有的(聲明的參數)的形式參數的數量。這隱藏在規格的Section 13.2中,步驟14和15.

因此,調用該函數的代碼檢查​​並將其傳遞給可選的第一個參數非常容易,或者根據不同而不同。當然,這意味着完全可以編寫一個函數來處理四參數版本,但是通過使用arguments而不是形式參數來愚弄框架。所以你不會那樣做。:-)

(道歉誤讀你的問題的第一次。)

+0

* p.s。你知道這種技術的名字嗎?* – Ross

+0

@羅斯:對不起,我錯過了那個評論。我不知道它有一個特定的名字。你正在測試函數的* [arity](http://en.wikipedia.org/wiki/Arity)*。 –

1

快速花了很長時間看功能arity;即有多少個參數在那裏:

function foo(err, req, res, next) { 
    if (arguments.length === 3) { // err isn't there 
     next = res; 
     res = req; 
     req = err; 
    } 
    ... 
} 

所以。檢測有多少個參數,並相應地混合變量。我甚至見過一些Node.js模塊爲你自動完成。

儘管最近我沒有檢查過,但在某些情況下,如果使用arguments -builtin將會禁用V8中的所有優化。

2

第一個函數有3個參數,第二個參數有4個參數,所以Express/Connect查看參數個數。

無法在參數之間切換。

相關問題