NodeJS / Express: что такое «app.use»?


332

В документации по expressмодулю NodeJS приведен пример кода app.use(...).

Что такое useфункция и где она определена?



На эти вопросы можно ответить, прочитав документацию.
Мина

47
документация немного загадочна для начинающего
KansaiRobot

6
Возможный дубликат выше ссылается друг на друга
Afrig Aminuddin

1
Документация совершенно неясно
Tessaracter

Ответы:


370

Объект приложения создается при создании сервера Express. Он имеет промежуточный стек, который можно настраивать app.configure()(сейчас это не рекомендуется в версии 4.x) .

Чтобы настроить промежуточное программное обеспечение, вы можете вызывать app.use(<specific_middleware_layer_here>)каждый слой промежуточного программного обеспечения, который вы хотите добавить (он может быть общим для всех путей или запускаться только на определенных путях, которые обрабатывает ваш сервер), и он будет добавлен в ваш стек промежуточного программного обеспечения Express . Слои промежуточного программного обеспечения могут добавляться один за другим в нескольких вызовах useили даже все сразу в серии с одним вызовом. Смотрите useдокументацию для более подробной информации.

Ниже приведен пример концептуального понимания промежуточного программного обеспечения Express. Вот как выглядит стек промежуточного программного обеспечения моего приложения (app.stack) при регистрации объекта приложения на консоли в виде JSON:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Как вы могли бы вывести, я позвонил app.use(express.bodyParser())и app.use(express.cookieParser())т. Д., Которые добавили эти экспресс-слои промежуточного программного обеспечения в стек промежуточного программного обеспечения. Обратите внимание, что маршруты пусты, что означает, что когда я добавил эти промежуточные слои, я указал, что они будут запускаться на любом маршруте. Если бы я добавил пользовательский слой промежуточного программного обеспечения, который срабатывал только по пути, /user/:idкоторый был бы отражен в виде строки в routeполе этого объекта слоя промежуточного программного обеспечения в распечатке стека выше.

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

Например, добавляя bodyParser, вы гарантируете, что ваш сервер обрабатывает входящие запросы с помощью промежуточного программного обеспечения Express . Итак, теперь синтаксический анализ тела входящих запросов является частью процедуры, которую ваше промежуточное программное обеспечение выполняет при обработке входящих запросов - все потому, что вы вызвали app.use(bodyParser).


116
Спасибо. было бы так сложно экспресс-людям объяснить это в своих документах API?
ericsoco

4
Итак, вы говорите, что когда запрос получен, данные передаются через эти парсеры, прежде чем они попадают в реальный сервис. Так, например: Valid Request-> Authentication-> ProcessesRequest-> ServResponse USE будет контролировать эти шаги в определенном порядке, а не выполнять их параллельно?
Адам Хесс

2
Так является ли внедрение зависимостей app.use () в действие?
Кевин С.

8
Когда вызывается функция, отправленная в app.use? После создания экспресс-сервера или для каждого запроса?
Тимо Хуовинен

5
@KevinC. Нет, это не внедрение зависимости. Это плагин архитектуры. Обычно этот тип архитектуры называется системой фильтрации / конвейером фильтра / каналом и фильтром. В Express канал - это next()обратный вызов, который должен вызывать каждое промежуточное программное обеспечение для передачи обработки следующей функции в конвейере. Система маршрутизации (первый аргумент app.use()) позволяет конвейеру разветвляться в зависимости от URL
slebetman

50

useметод настройки промежуточного программного обеспечения, используемого маршрутами объекта HTTP-сервера Express. Метод определен как часть Connect, на котором основан Express.

Обновление Начиная с версии 4.x, Express больше не зависит от Connect .

Функции промежуточного программного обеспечения, которые ранее были включены в Express, теперь находятся в отдельных модулях; см. список функций промежуточного программного обеспечения .


3
И онлайн документы здесь: senchalabs.org/connect/proto.html#app.use
Александр Берд,

Будет ли это эффективно, если промежуточное программное обеспечение Node создает объекты? Будет ли это означать, что при каждом запросе это промежуточное ПО создает новые объекты? Старые объекты выбрасываются? Напримерapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai Можно создавать экземпляры объектов при каждом запросе. Они будут собирать мусор, если вы не храните ссылки на объекты вне области действия вашего обработчика запросов.
jeff_mcmahan

1
@AlexanderBird спасибо за ссылки (1-й сейчас не работает). Для записи, только начало документа во 2-й ссылке говорит: «Использовать данный дескриптор промежуточного программного обеспечения для данного маршрута, по умолчанию /. Этот« маршрут »является точкой монтирования для промежуточного программного обеспечения, когда задано значение, отличное от / промежуточное программное обеспечение действует только тогда, когда этот сегмент присутствует в имени пути запроса. Например, если мы смонтируем функцию в / admin, она будет вызываться в / admin и / admin / settings, однако она не будет вызываться для / или / сообщения ". Просто :)
Адриен Бе

40

Каждый app.use (промежуточное программное обеспечение) вызывается каждый раз, когда запрос отправляется на сервер.


7
Ваш ответ в одном предложении мгновенно понятен и более полезен, чем другие объяснения из нескольких параграфов.
stackedAndOverflowed

16

app.use () используется для монтирования функции промежуточного программного обеспечения или монтирования по указанному пути, функция промежуточного программного обеспечения выполняется, когда совпадает базовый путь.

Например: если вы используете app.use () в indexRouter.js, вот так:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

В приведенном выше коде app.use () смонтируйте путь в / ads для adsRouter.js.

Сейчас в adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

в adsRouter.js путь будет таким же для ads- '/ ads / show', а затем он будет работать в соответствии с controllerIndex.ads.showAd ().

app.use ([путь], обратный вызов, [обратный вызов]): мы можем добавить обратный вызов на то же самое.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });

Я бы использовал «карту» вместо «гора», чтобы было легче понять.
Jeb50

13

app.use () выступает в качестве промежуточного программного обеспечения в экспресс-приложениях. В отличие от app.get () и app.post () или около того, вы можете использовать app.use () без указания URL-адреса запроса. В таком случае он выполняется каждый раз, независимо от того, по какому URL был достигнут щелчок.


7

app.use () работает так:

  1. Событие запроса сработало на экземпляре сервера http узла.
  2. Express делает некоторые из своих внутренних манипуляций с объектом req.
  3. Это когда экспресс начинает делать вещи, которые вы указали в app.use

что очень просто.

И только тогда Express сделает все остальное, как маршрутизация.


6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use - это способ регистрации промежуточного программного обеспечения или цепочки промежуточного программного обеспечения (или нескольких промежуточных программ) перед выполнением любой логики конечного маршрута или логики промежуточного маршрута в зависимости от порядка последовательности регистрации промежуточного программного обеспечения.

Промежуточное программное обеспечение: формирует цепочку функций / промежуточного программного обеспечения с 3 параметрами: req, res и next . next - обратный вызов, который ссылается на следующую функцию промежуточного программного обеспечения в цепочке, а в случае последней функции промежуточного программного обеспечения цепочки next указывает на функцию первого промежуточного программного обеспечения следующей зарегистрированной промежуточной цепочки.


1
Работает как шарм!
Anmol Rai

3

В Express, если мы импортируем express из «express» и используем app = express (); тогда приложение, имеющее всю функциональность экспресс

если мы используем app.use ()

с любым модулем / функцией промежуточного программного обеспечения для использования во всем экспресс-проекте


3

app.useэта функция требует промежуточного программного обеспечения. Например:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

В этом примере показана функция промежуточного программного обеспечения, установленная в /user/:idпути. Эта функция выполняется для любого типа HTTP-запроса в /user/:idпути.

Он похож на веб-сервер REST, просто используйте разные /xxдля представления различных действий.


спасибо за ответ, но, поскольку кто-то другой уже сказал всю эту информацию, я не буду голосовать за эту. Я не думаю, что мне нужно каждое объяснение того, что useможет сделать экспресс ; Мне просто нужно было знать, что это такое (и любые контекстные знания, чтобы узнать, как лучше исследовать себя).
Александр Берд

3

app.use работает в качестве промежуточного программного обеспечения для запроса приложения. синтаксис

app.use('pass request format',function which contain request response onject)

пример

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

также вы можете использовать его в случае маршрутизации вашего запроса.

app.use('/', roting_object);

2

Промежуточное программное обеспечение - это общий термин для программного обеспечения, которое служит для «склейки», поэтому app.use - это метод для настройки промежуточного программного обеспечения, например: для анализа и обработки тела запроса: app.use (bodyParser.urlencoded ({extended: true) })); app.use (bodyParser.json ()); Есть много промежуточного программного обеспечения, которое вы можете использовать в вашем экспресс-приложении, просто прочитайте документацию: http://expressjs.com/en/guide/using-middleware.html


2

app.use применяет указанное промежуточное ПО к стеку промежуточного ПО основного приложения. При подключении промежуточного программного обеспечения к основному стеку приложений порядок подключения имеет значение; если вы подключите промежуточное программное обеспечение A до промежуточного программного обеспечения B, промежуточное программное обеспечение A всегда будет выполняться первым. Вы можете указать путь, к которому применимо конкретное промежуточное программное обеспечение. В приведенном ниже примере «Привет, мир» всегда будет записываться перед «счастливыми праздниками».

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})

2

Он позволяет вам использовать любое промежуточное программное обеспечение ( подробнее ), например body_parser, CORSи т.д. Промежуточное программное обеспечение может вносить изменения requestи в responseобъекты. Он также может выполнить кусок кода.


Спасибо за ответ, но я считаю, что вся эта информация уже отражена в других ответах
Александр Берд

2

Вы также можете создать свою собственную функцию промежуточного программного обеспечения, такую ​​как

app.use( function(req, res, next) {
  // your code 
  next();
})

Он содержит три параметра req, res, next
Вы можете также использовать его для аутентификации и проверок входного Params держать контроллер в чистоте.

next()используется для перехода к следующему промежуточному программному обеспечению или маршруту.
Вы можете отправить ответ из промежуточного программного обеспечения


1

Свяжите промежуточное программное обеспечение уровня приложения с экземпляром объекта app с помощью функций app.use () и app.METHOD (), где METHOD - это HTTP-метод запроса, который обрабатывает функция промежуточного программного обеспечения (например, GET, PUT или POST) в нижнем регистре.


1

Короче говоря, app.use () поддерживает все типы запросов [например: get, post, ...], поэтому в основном используется для установки middelware. или может использоваться для разделения маршрутов и функций

пример:

app.use("/test",functionName)

и functionName находится в другом файле


Спасибо за ответ, но я верю, что вся эта информация уже отражена в других ответах.
Александр Берд

1

app.use() это метод промежуточного программного обеспечения.

Промежуточный метод подобен перехватчику в Java, этот метод всегда выполняется для всех запросов.

Назначение и использование промежуточного программного обеспечения: -

  1. Чтобы проверить, истек ли сеанс или нет
  2. для аутентификации пользователя и авторизации
  3. проверить наличие cookie (срок действия)
  4. анализировать данные перед ответом

Промежуточное ПО - это функция, переданная в app.use ().
NattyC

1

app.use
создается с помощью Express (инфраструктура промежуточного программного обеспечения nodejs).
app.use используется для выполнения любого конкретного запроса в процессе
внедрения server.js (узел)
var app = require ('express'); так что в основном функция app.use вызывается каждый раз, когда сервер
app.use(bodyparser.json())


0

app.use - промежуточное ПО уровня приложения

Свяжите промежуточное программное обеспечение уровня приложения с экземпляром объекта app с помощью функций app.use () и app.METHOD (), где METHOD - это HTTP-метод запроса, который обрабатывает функция промежуточного программного обеспечения (например, GET, PUT или POST) в нижнем регистре.

Вы можете использовать для проверки всех запросов, например, вы хотите проверить токен / токен доступа, вам нужно написать промежуточное ПО, используя app.use для проверки токена в запросе.

В этом примере показана функция промежуточного программного обеспечения без пути монтирования. Функция выполняется каждый раз, когда приложение получает запрос.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

ссылка с https://expressjs.com/en/guide/using-middleware.html


app.use () не является промежуточным программным обеспечением. Промежуточное программное обеспечение - это функция, переданная в app.use ()
NattyC

0

app.use (путь, промежуточное программное обеспечение) используется для вызова функции промежуточного программного обеспечения, которую необходимо вызвать до того, как будет достигнут маршрут для соответствующего пути. Несколько функций промежуточного программного обеспечения могут быть вызваны через app.use.

app.use ('/ fetch', EnforceAuthentication) -> Промежуточное ПО EnforceAuthentication будет вызвано, когдабудет получензапрос, начинающийся с '/ fetch' . Это может быть / fetch / users , / fetch / ids / {id} и т. Д.

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

app.use (() => {// Инициализация общего сервиса})

next () fn необходимо вызывать в каждой функции промежуточного программного обеспечения, когда несколько функций промежуточного программного обеспечения передаются в app.use , иначе следующая функция промежуточного программного обеспечения не будет вызываться.

ссылка : http://expressjs.com/en/api.html#app.use

Примечание. В документации сказано, что мы можем обойти функции промежуточного программного обеспечения после текущей, вызвав next ('route') внутри текущей функции промежуточного программного обеспечения, но этот метод не работал для меня в app.use, но работал с app.METHOD, как показано ниже , Итак, были названы fn1 и fn2, но не fn3.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.