Подтвердить что ты не робот

Как это работает? Необязательный первый аргумент, используемый в Express (err, req, res, next) или (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)

Я пропустил что-то основное здесь? Можно ли запросить, сколько аргументов ожидает функция?

Изменить: спасибо за ответы ниже. но функция промежуточного слоя передается для выражения, поэтому переменная arguments недопустима. хотя length верен... Думаю, я понял, было бы хорошо иметь подтверждение, так ли это. Пример ниже:

var fn;

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

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

Ответ 1

Я думаю, что понял это, было бы неплохо иметь подтверждение, действительно ли это так.

var fn;

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

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

Да, это правильно. Свойством length экземпляра Function является число формальных параметров (объявленных аргументов), которые оно имеет. Это скрыто в Раздел 13.2 спецификации, шаги 14 и 15.

Поэтому для кода, вызывающего функцию, проверить fn.length и передать ему необязательный первый аргумент, или нет, в зависимости от этого. Это, конечно, означает, что вполне возможно написать функцию, которая будет обрабатывать версию с четырьмя аргументами, но обманывает структуру, используя arguments, а не формальные параметры. Таким образом, вы бы этого не сделали.: -)

(Извинения за неправильное понимание вашего вопроса в первый раз.)

Ответ 2

Первая функция имеет 3 аргумента, вторая имеет 4 аргумента, поэтому Express/Connect рассматривает количество аргументов.

Невозможно переключиться между аргументами.

Ответ 3

Express тратит довольно много времени на arity функции; то есть сколько аргументов находится там:

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

Итак. Определите, сколько аргументов есть, и соответственно перетасовывайте переменные. Я даже видел некоторые Node.js-модули, которые автоматически делают для вас.

И хотя я еще не проверил недавно, были случаи, когда messing с arguments -builtin отключил бы все оптимизации в V8.