Как это работает? Необязательный первый аргумент, используемый в Express (err, req, res, next) или (req, res, next) - PullRequest
12 голосов
/ 08 декабря 2011

С помощью 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

Ответы [ 3 ]

9 голосов
/ 08 декабря 2011

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

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 голосов
/ 08 декабря 2011

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

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

1 голос
/ 08 декабря 2011

Экспресс тратит довольно много времени, глядя на арность функции; т.е. сколько там аргументов:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...