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

Ros*_*oss 12 javascript connect node.js express

使用Express/Connect,我可以使用以下任一格式设置中间件功能:

function(req, res, next) // first argument will be a request
Run Code Online (Sandbox Code Playgroud)

要么

function(err, req, res, next) // first argument will be an error
Run Code Online (Sandbox Code Playgroud)

退出Express,Connect,再到基本JavaScript:我不明白如何有可选的第一个参数

如何知道我的函数会先接受一个err对象?我想这可能使结构必须如下:

function(req, res, next, err)
Run Code Online (Sandbox Code Playgroud)

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

编辑:感谢下面的答案.但是中间件函数被传递给express,所以arguments变量无效.虽然length是正确的......我想我已经弄明白了,最好确认是否是这种情况.示例如下:

var fn;

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

fn = function (one, two, three) {};
console.log(fn.length); // 3
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 9

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

var fn;

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

fn = function (one, two, three) {};
console.log(fn.length); // 3
Run Code Online (Sandbox Code Playgroud)

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

所以调用函数的代码很容易检查fn.length并传递可选的第一个参数,取决于它.这也意味着,当然,这是完全可以编写一个函数处理这四个参数版本,但是通过使用傻瓜的框架arguments,而不是正式的参数.所以你不会这样做.:-)

(抱歉第一次误读你的问题.)