这是如何运作的? Express(err,req,res,next)或(req,res,next)中使用的可选第一个参数

时间:2011-12-08 12:45:37

标签: javascript node.js express connect

使用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

3 个答案:

答案 0 :(得分:9)

  

我想我已经弄明白了,最好确认是否是这种情况

var fn;

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

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

是的,这是正确的。 length实例的Function属性是它具有的形式参数(声明的参数)的数量。这隐藏在规范Section 13.2中,第14步和第15步。

所以调用函数的代码很容易检查fn.length并将可选的第一个参数传递给它,具体取决于那个。当然,这确实意味着完全可以编写处理四参数版本的函数,但是使用arguments而不是形式参数来欺骗框架。所以你不会这样做。 : - )

(第一次误读你的问题道歉。)

答案 1 :(得分:2)

第一个函数有3个参数,第二个函数有4个参数,所以Express / Connect查看参数的数量。

无法在参数之间切换。

答案 2 :(得分:1)

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 - 内置会禁用V8中的所有优化。