Nodejs и Connect "следующая" функциональность - PullRequest
4 голосов
/ 01 августа 2011

Кажется, что если я хочу перейти к "следующей" функции в Nodejs (и, возможно, к Javascript в целом?), Я не могу передать параметры следующей функции.

Вот что я имею в виду:

app.get('/webpage', SomeFunction, NextFunction);

function SomeFunction (req, res, next) {
    // Do things
    next();
}

function NextFunction (req, res) {
    // Do other things
}

Теперь, если бы в SomeFunction я бы сказал next(req, res);, это, похоже, не работает.Это никогда не добирается до метода.Очевидно, я не могу напрямую передать параметры ... но мой вопрос почему?Как следующая функция узнает, какие параметры использовать?Это потому, что они названы одинаково, или он автоматически передает 1-й и 2-й параметры?Если бы NextFunction использовал blah, bleet вместо req, res, он все еще работал бы?

1 Ответ

15 голосов
/ 01 августа 2011

Это намеренный аспект разработки Connect (промежуточное программное обеспечение node.js, отвечающее за это поведение). Функция next, которую получает ваше промежуточное ПО, - , а не - следующее промежуточное ПО в стеке; это функция, которую генерирует Connect, которая запрашивает следующее промежуточное программное обеспечение для обработки (а также делает некоторые дополнительные действия для обработки особых случаев, например, когда нет «следующего промежуточного программного обеспечения»).

Если ваше промежуточное ПО должно возвращать ответ, просто сделайте это. Если это не так, подразумевается, что какое-то промежуточное программное обеспечение должно возвращать ответ. Если вам нужно передать данные этой более поздней части процесса, вам следует прикрепить их к соответствующей части объекта запроса req.

Например, связанное промежуточное программное обеспечение bodyParser отвечает за заполнение req.rawBody и req.body на основе содержимого тела запроса. Связанное промежуточное ПО basicAuth заполняет req.remoteUser на основе аутентификации HTTP.

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

...