Как это работает? Необязательный первый аргумент, используемый в 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
Ответы
Ответ 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.