簡體   English   中英

這是如何運作的? Express(err,req,res,next)或(req,res,next)中使用的可選第一個參數

[英]How does this work? Optional first argument used in Express (err, req, res, next) or (req, res, next)

使用Express / Connect,我可以使用以下任一格式設置中間件功能:

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

要么

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

退出Express,Connect,再到基本JavaScript:我不明白如何有可選的第一個參數

怎么能表達我的函數會先接受err對象? 我想這可能使結構必須如下:

function(req, res, next, err)

我錯過了一些基本的東西嗎? 是否可以查詢函數期望的參數數量?

編輯:感謝下面的答案。 但是中間件函數被傳遞給express,因此arguments變量無效。 雖然length是正確的...我想我已經弄明白了,最好確認是否是這種情況。 示例如下:

var fn;

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

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

我想我已經弄明白了,最好確認是否是這種情況

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

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

因此,調用函數的代碼很容易檢查fn.length並將可選的第一個參數傳遞給它,具體取決於那個。 這也意味着,當然,這是完全可能的編寫處理四個參數版本的功能,但蠢人由使用該框架arguments ,而不是正式的參數。 所以你不會這樣做。 :-)

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

第一個函數有3個參數,第二個函數有4個參數,因此Express / Connect查看參數的數量。

在參數之間切換是不可能的。

Express花了很長時間看這個函數的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中的所有優化。

暫無
暫無

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

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