繁体   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