NodeJS / Express: що таке "app.use"?


332

У документах для expressмодуля NodeJS приклад коду є app.use(...).

Що таке useфункція і де вона визначена?



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

47
документація дещо криптовалюта для початківця
KansaiRobot

6
Можливий дублікат вище - це посилання на один одного
Afrig Aminuddin,

1
Документація абсолютно незрозуміла
Tessaracter

Відповіді:


370

Об'єкт програми створений для створення експрес-сервера. Він має стек середнього програмного забезпечення, який можна налаштувати app.configure()(це тепер застаріло у версії 4.x) .

Щоб налаштувати ваше проміжне програмне забезпечення, ви можете викликати app.use(<specific_middleware_layer_here>)кожен рівень проміжного програмного забезпечення, який ви хочете додати (він може бути загальним для всіх шляхів або запускатись лише на певних (іх) трасах) вашого сервера), і він додаватиметься до вашого стека програмного забезпечення Express . Проміжні верстви можна додавати один за одним у декількох викликах useабо навіть усі відразу послідовно з одним викликом. Детальнішу інформацію див. У useдокументації .

Щоб навести приклад концептуального розуміння програми Express Middleware, ось як виглядає мій стек середнього програмного забезпечення програми (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, ви гарантуєте, що ваш сервер обробляє вхідні запити через експрес-проміжне програмне забезпечення . Отже, зараз аналіз тіла вхідних запитів є частиною процедури, яку здійснює ваше проміжне програмне забезпечення під час обробки вхідних запитів - все тому, що ви зателефонували app.use(bodyParser).


116
Дякую тобі. невже експресним людям буде так важко пояснити це у своїх документах API?
ericsoco

4
Отже, ви говорите, що після отримання запиту дані передаються через ці аналізатори, перш ніж потрапляти на реальну послугу. Так, наприклад: Дійсний запит-> Автентифікація-> ПроцесиРеєстрація-> СервРеспонс USE контролював би ці кроки у визначеному порядку, а не виконував їх паралельно?
Адам Гесс

2
Так чи вводиться залежність app.use () в дію?
Кевін К.

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

5
@KevinC. Ні, це не введення залежності. Це архітектура плагінів. Зазвичай такий тип архітектури називається фільтруюча система / фільтрувальний трубопровід / труба та фільтр. У програмі Express труба - це next()зворотний виклик, який очікується, що кожне проміжне програмне забезпечення закликає передати обробку наступній функції в конвеєрі. Система маршрутизації (перший аргумент до app.use()) дозволяє
конвеєру

50

useце спосіб налаштування проміжного програмного забезпечення, що використовується маршрутами об’єкта сервера Express HTTP. Метод визначений як частина 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 thx для посилань (хоча 1-й зараз зламаний). Для запису лише початок doc у 2-му посиланні говорить: "Використовуйте задану ручку середнього програмного забезпечення для даного маршруту, дефолт - /. Цей" маршрут "є точкою кріплення для середнього програмного забезпечення, коли йому надано значення, відмінне від / Посереднє програмне забезпечення ефективне лише тоді, коли цей сегмент присутній у імені шляху запиту. Наприклад, якщо ми монтуємо функцію в / admin, вона буде викликана в / admin та / admin / settings, однак вона не буде викликана для / або / дописи ". Просте :)
Adrien Be

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. Експрес робить деяку внутрішню маніпуляцію об'єктом req.
  3. Це коли Express починає робити те, що ви вказали за допомогою 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 . Далі - зворотний виклик, який посилається на наступну функцію середнього програмного забезпечення в ланцюзі, а в разі останньої функції середнього програмного забезпечення ланцюга, наступний вказує на функцію першого середнього програмного забезпечення наступної зареєстрованої ланцюга середньої одиниці.


1
Працює як шарм !!
Анмол Рай

3

У експресі, якщо ми імпортуємо експрес з "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 ({розширений: вірно) })); 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т.д. Middleware може вносити зміни requestі responseоб'єкти. Він також може виконати фрагмент коду.


Дякую за відповідь, але я вважаю, що вся інформація вже зафіксована в інших відповідях
Олександр Птах

2

Ви також можете створити власну функцію програмного забезпечення на зразок

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

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

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


1

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


1

Коротше кажучи, app.use () підтримує всі типи запитів [наприклад: отримати, опублікувати, ...], тому його в основному використовують для налаштування середнього програмного забезпечення. або їх можна використовувати, коли маршрути та функції відокремлені

приклад:

app.use("/test",functionName)

і functionName розташований в іншому файлі


Дякую за відповідь, але я вважаю, що вся інформація вже зафіксована в інших відповідях.
Олександр Птах

1

app.use() є проміжним методом.

Метод середнього програмного забезпечення - як перехоплювач у Java, цей метод завжди виконується для всіх запитів.

Призначення та використання проміжного програмного забезпечення: -

  1. Щоб перевірити, чи закінчився сеанс чи ні
  2. для аутентифікації та авторизації користувача
  3. чек на cookie (термін дії)
  4. дані аналізу перед відповіддю

Посереднє програмне забезпечення - це функція, передана в app.use ().
NattyC

1

app.use
створюється за допомогою express (nodejs middleware Framework)
app.use - це використання для виконання будь-якого конкретного запиту в процесі
ініціалізації server.js (node)
var app = requ ('express'); тому в основному функція app.use викликається кожного разу при запуску сервера
app.use(bodyparser.json())


0

app.use - це програмне забезпечення рівня програм

Прив’яжіть проміжне програмне забезпечення рівня додатка до екземпляра об’єкта програми за допомогою функцій 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', ExecuceAuthentication) -> ExecuceAuthentication середнє програмне забезпечення fn буде викликано, коли надійде запит, що починається з '/ fetch' . Це може бути / fetch / користувачів , / fetch / ids / {id} тощо

Деякі функції програмного забезпечення, можливо, доведеться викликати незалежно від запиту. У таких випадках шлях не вказується, і оскільки шлях за замовчуванням до / та кожного запиту починається з / , ця функція середнього програмного забезпечення буде викликана для всіх запитів.

app.use (() => {// Ініціалізувати загальну службу})

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

довідка: http://expressjs.com/en/api.html#app.use

Примітка: У документації сказано , ми можемо перепускний проміжного програмного функцій після поточного, викликавши наступний ( «маршрут») в межах поточної функції проміжного програмного забезпечення , але цей метод не працював для мене в 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.