这是如何工作的呢?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)

本文关键字:next req res 何工作 工作 Express err      更新时间:2023-09-26

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

我错过了一些基本的东西吗?是否可以查询一个函数期望有多少个参数?

中间件函数传递给表达式,因此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花了相当长的时间来查看函数的唯一性;也就是说,里面有多少个参数:

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

。检测有多少参数,并相应地调整变量。我甚至见过一些node .js模块可以自动为你做这些。

虽然我最近没有检查过,但在某些情况下,与arguments内置混淆会禁用V8中的所有优化