这个怎么用? 在Express中使用可选的第一个参数(err,req,res,next)或者(req,res,next)

使用Express / Connect,我可以使用以下任何一种格式来设置中间件function:

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

要么

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

从Express,Connect连接到基本的JavaScript:我不明白这是如何有可能有一个可选的第一个参数

如何expression知道我的函数会先接受一个err对象? 我认为要做到这一点,结构必须像下面这样:

 function(req, res, next, err) 

我在这里错过什么基本的东西? 是否有可能查询一个函数预计有多less个参数?

编辑:感谢下面的答案。 但中间件函数被传递来表示,所以argumentsvariables是无效的。 虽然length是正确的…我想我已经明白了,对于是否确实是这样的情况是很好的。 示例如下:

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

       

网上收集的解决方案 "这个怎么用? 在Express中使用可选的第一个参数(err,req,res,next)或者(req,res,next)"

我想我已经弄清楚了,对于是否确实是这样的,是很好的

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

对,那是正确的。 Function实例的length属性是它所具有的forms参数 (声明的参数)的数量。 这是隐藏在规范第13.2节 ,步骤14和15。

所以调用该函数的代码很容易检查fn.length并将其传递给可选的第一个参数,或者不要,这取决于它。 当然,这确实意味着编写一个可以处理四参数版本的函数是完全可能的,但是通过使用arguments而不是forms参数来欺骗框架。 所以你不会这样做。 🙂

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

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

在参数之间切换是不可能的。

快看花function的相当长一段时间; 即在那里有多less个参数:

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

所以。 检测有多less个参数,并相应地随机variables。 我甚至见过一些Node.js模块自动为你做。

尽pipe最近我没有检查过,但是有些情况下,会使用arguments –builtin来禁用V8中的所有优化。