这个怎么用? 在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个参数?
编辑:感谢下面的答案。 但中间件函数被传递来表示,所以arguments
variables是无效的。 虽然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
属性是它所具有的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中的所有优化。