NodeJS / Express: co to jest „app.use”?

332

W dokumentacji dla expressmodułu NodeJS przykładowy kod ma app.use(...).

Jaka jest usefunkcja i gdzie jest zdefiniowana?

Alexander Bird
źródło
5
możliwy duplikat: stackoverflow.com/questions/7337572/...
Alexander Bird
Na tego rodzaju pytania można odpowiedzieć, czytając dokumentację.
Mina,
47
dokumentacja jest nieco tajemnicza dla początkującego
KansaiRobot 27.04.18
6
Możliwy duplikat powyżej odnosi się do siebie
Afrig Aminuddin
1
Dokumentacja jest całkowicie niejasna
Tessaracter 29.12.19

Odpowiedzi:

369

Obiekt aplikacji jest tworzony przy tworzeniu serwera Express. Ma stos oprogramowania pośredniego, który można dostosować app.configure()(jest to obecnie przestarzałe w wersji 4.x) .

Aby skonfigurować oprogramowanie pośrednie, możesz wywołać app.use(<specific_middleware_layer_here>)każdą warstwę oprogramowania pośredniego, które chcesz dodać (może być ogólne dla wszystkich ścieżek lub uruchamiane tylko na określonych ścieżkach obsługiwanych przez serwer), i doda się do stosu oprogramowania pośredniego Express . Warstwy oprogramowania pośredniego można dodawać jeden po drugim w wielu wywołaniach uselub nawet wszystkie jednocześnie w jednym wywołaniu. Więcej informacji znajduje się w usedokumentacji .

Aby podać przykład koncepcyjnego zrozumienia Express Middleware, oto jak wygląda mój stos oprogramowania pośredniego aplikacji (app.stack) podczas logowania obiektu aplikacji do konsoli jako 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] } ]

Jak może być w stanie wydedukować, zadzwoniłem app.use(express.bodyParser()), app.use(express.cookieParser())itp, który dodaje te wyrażają middleware „warstw” na stos middleware. Zauważ, że trasy są puste, co oznacza, że ​​kiedy dodałem te warstwy oprogramowania pośredniego, podałem, że będą one uruchamiane na dowolnej trasie. Gdybym dodał niestandardową warstwę oprogramowania pośredniego, która wyzwalała się tylko na ścieżce, /user/:idktóra byłaby odzwierciedlona jako ciąg znaków w routepolu tego obiektu warstwy oprogramowania pośredniego na wydruku stosu powyżej.

Każda warstwa zasadniczo dodaje funkcję, która konkretnie obsługuje coś w twoim przepływie przez oprogramowanie pośrednie.

Np. Dodając bodyParser, masz pewność , że Twój serwer obsługuje przychodzące żądania za pośrednictwem ekspresowego oprogramowania pośredniego . Dlatego teraz analizowanie treści przychodzących żądań jest częścią procedury, którą wykonuje oprogramowanie pośrednie podczas obsługi żądań przychodzących - wszystko dlatego, że zadzwoniłeś app.use(bodyParser).

chinnychinchin
źródło
116
Dziękuję Ci. czy tak trudno byłoby ekspresowym ludziom wyjaśnić to w dokumentach API?
ericsoco
4
Mówisz więc, że po otrzymaniu żądania dane są przekazywane przez te analizatory składni przed dotarciem do faktycznej usługi. Na przykład: Prawidłowe żądanie-> Uwierzytelnianie-> ProcessesRequest-> ServResponse USE kontroluje te kroki w określonej kolejności i nie wykonuje ich równolegle?
Adam Hess,
2
Czy działa zatem wstrzykiwanie zależności app.use ()?
Kevin C.
8
Kiedy wywoływana jest funkcja wysyłana do app.use? Po utworzeniu serwera ekspresowego lub na każde żądanie?
Timo Huovinen
5
@KevinC. Nie, to nie jest wstrzykiwanie zależności. Jest to architektura wtyczek. Ogólnie tego rodzaju architektura nazywa się systemem filtrów / potokiem filtrów / potokiem i filtrem. W Expressie potok jest next()wywołaniem zwrotnym, które ma wywoływać każde oprogramowanie pośrednie, aby przekazać przetwarzanie do następnej funkcji w potoku. System routingu (pierwszy argument app.use()) pozwala na rozgałęzienie potoku w zależności od adresu URL
slebetman,
50

useto metoda konfiguracji oprogramowania pośredniego używanego przez trasy obiektu serwera Express HTTP. Metoda jest zdefiniowana jako część Connect, na której opiera się Express.

Aktualizacja Począwszy od wersji 4.x, Express nie zależy już od Connect .

Funkcje oprogramowania pośredniego, które wcześniej były zawarte w Express, są teraz w osobnych modułach; zobacz listę funkcji oprogramowania pośredniego .

JohnnyHK
źródło
3
Dokumenty
Alexander Bird
Czy byłoby wydajne, gdyby oprogramowanie pośrednie węzła tworzyło obiekty? Czy to oznacza, że ​​na każde żądanie oprogramowanie pośrednie tworzy nowe obiekty? Czy stare przedmioty są odrzucane? Na przykładapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai
1
@CMCDragonkai Można tworzyć instancje obiektów na każde żądanie. Będą zbierane śmieci, dopóki nie przechowujesz referencji do obiektów poza zakresem procedury obsługi żądań.
jeff_mcmahan
1
@AlexanderBird thx dla linków (pierwszy jest teraz zepsuty). Dla przypomnienia, na początku dokumentu w drugim łączu jest napisane: „Wykorzystaj podany uchwyt oprogramowania pośredniego do danej trasy, domyślnie ustawiony na /. Ta„ trasa ”jest punktem montowania oprogramowania pośredniego, jeśli podano wartość inną niż / oprogramowanie pośrednie działa tylko wtedy, gdy ten segment jest obecny w ścieżce żądania. Na przykład, jeśli chcielibyśmy zamontować funkcję w / admin, byłby on wywołany w / admin i / admin / settings, jednak nie zostałby wywołany dla / , lub / posts ”. Proste :)
Adrien Be
40

Każde app.use (oprogramowanie pośrednie) jest wywoływane za każdym razem, gdy żądanie jest wysyłane do serwera.

Tyrese
źródło
7
Twoja odpowiedź na jedno zdanie jest natychmiast zrozumiała i bardziej pomocna niż inne objaśnienia do wielu akapitów.
stackedAndOverflow Flow
16

app.use () służy do montowania funkcji oprogramowania pośredniego lub montowania do określonej ścieżki, funkcja oprogramowania pośredniego jest wykonywana, gdy ścieżka podstawowa jest zgodna.

Na przykład: jeśli używasz app.use () w indexRouter.js, to tak:

//indexRouter.js

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

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

W powyższym kodzie app.use () zamontuj ścieżkę na „/ ads” do adsRouter.js.

Teraz w adsRouter.js

// adsRouter.js

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

w adsRouter.js ścieżka będzie taka jak dla ads- '/ ads / show', a następnie będzie działać zgodnie z controllerIndex.ads.showAd ().

app.use ([ścieżka], oddzwanianie, [oddzwonienie]): możemy dodać oddzwanianie na to samo.

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

  // write your callback code here.

    });
Shubham Verma
źródło
Użyłbym „mapy” zamiast „wierzchowca”, co jest łatwiejsze do zrozumienia.
Jeb50
13

app.use () działa jako oprogramowanie pośrednie w aplikacjach ekspresowych. W przeciwieństwie do app.get () i app.post () , możesz użyć app.use () bez podawania adresu URL żądania. W takim przypadku program jest wykonywany za każdym razem, bez względu na trafiony adres URL.

Omkar Mote
źródło
7

app.use () działa w ten sposób:

  1. Zdarzenie żądania wywołane w instancji serwera HTTP węzła.
  2. express wykonuje część swoich wewnętrznych manipulacji za pomocą obiektu req.
  3. To jest, gdy express zaczyna robić rzeczy określone przez app.use

co bardzo proste.

I tylko wtedy ekspres wykona resztę rzeczy, takich jak routing.

Anton Stafiejew
źródło
6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use to sposób na rejestrację oprogramowania pośredniego lub łańcucha oprogramowania pośredniego (lub wielu programów pośrednich ) przed wykonaniem jakiejkolwiek logiki trasy końcowej lub logiki trasy pośredniej, w zależności od kolejności sekwencji rejestracji oprogramowania pośredniego.

Oprogramowanie pośrednie: tworzy łańcuch funkcji / funkcje oprogramowania pośredniego z 3 parametrami: wymagania, res i dalej . next jest wywołaniem zwrotnym, które odnosi się do następnej funkcji oprogramowania pośredniego w łańcuchu, aw przypadku ostatniej funkcji oprogramowania pośredniego łańcucha kolejne punkty do funkcji pierwszego oprogramowania pośredniego następnego zarejestrowanego łańcucha pośredniego.

JackOfAshes - Mohit Gawande
źródło
1
Działa jak marzenie !!
Anmol Rai,
3

W express, jeśli importujemy ekspres z „express” i używamy app = express (); następnie aplikacja posiadająca wszystkie funkcje ekspresowe

jeśli użyjemy app.use ()

z dowolną funkcją modułu / oprogramowania pośredniego do użycia w całym projekcie ekspresowym

saurabh kumar
źródło
3

app.usejest funkcją wymagającą oprogramowania pośredniego. Na przykład:

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

Ten przykład pokazuje zainstalowaną na /user/:idścieżce funkcję oprogramowania pośredniego . Ta funkcja jest wykonywana dla dowolnego typu żądania HTTP na /user/:idścieżce.

Jest podobny do serwera REST Web Server, wystarczy użyć innego /xxdo reprezentowania różnych działań.

Hongnan Yan
źródło
dziękuję za odpowiedź, ale ponieważ ktoś inny powiedział już wszystkie te informacje, nie będę głosować za tym. Nie sądzę, że potrzebuję każdego wyjaśnienia, co usemoże zrobić ekspres ; Po prostu musiałem wiedzieć, że to jest to (i wszelka wiedza kontekstowa, aby wiedzieć, jak samodzielnie badać).
Alexander Bird
3

app.use jest woksem jako oprogramowanie pośrednie dla żądania aplikacji. składnia

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

przykład

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

możesz go również użyć w przypadku przekierowania żądania.

app.use('/', roting_object);
chetan awate
źródło
2

Oprogramowanie pośrednie to ogólny termin określający oprogramowanie, które służy do „sklejenia”, więc app.use to metoda konfiguracji oprogramowania pośredniego, na przykład: parsowanie i obsługa treści żądania: app.use (bodyParser.urlencoded ({Extended: true })); app.use (bodyParser.json ()); istnieje wiele programów pośrednich, których można użyć w aplikacji ekspresowej. Przeczytaj dokument: http://expressjs.com/en/guide/using-middleware.html

użytkownik3432221
źródło
2

app.use stosuje określone oprogramowanie pośrednie do głównego stosu oprogramowania pośredniego aplikacji. Podczas dołączania oprogramowania pośredniego do głównego stosu aplikacji kolejność załączników ma znaczenie; jeśli dołączasz oprogramowanie pośrednie A przed oprogramowaniem pośrednim B, oprogramowanie pośrednie A zawsze będzie uruchamiane jako pierwsze. Możesz określić ścieżkę, dla której ma zastosowanie określone oprogramowanie pośrednie. W poniższym przykładzie „witaj świecie” zawsze będzie rejestrowany przed „szczęśliwymi świętami”.

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()
})
Rubin bhandari
źródło
2

To pozwala na użycie dowolnego middleware ( czytaj więcej ), jak body_parser, CORSitp Middleware może dokonać zmian requesti responseobiektów. Może również wykonać fragment kodu.

Binayak Gouri Shankar
źródło
Dzięki za odpowiedź, ale wierzę, że wszystkie te informacje są już zawarte w innych odpowiedziach
Alexander Bird,
2

Możesz także utworzyć własną funkcję oprogramowania pośredniego

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

Zawiera ona trzy parametry req, res, next
można go również używać do uwierzytelniania i walidacji params wejściowych, aby utrzymać swój kontroler czyste.

next()służy do przejścia do następnego oprogramowania pośredniego lub trasy.
Możesz wysłać odpowiedź z oprogramowania pośredniego

Ashvin Ahjolia
źródło
1

Powiązanie oprogramowania pośredniego na poziomie aplikacji z instancją obiektu aplikacji za pomocą funkcji app.use () i app.METHOD (), gdzie METHOD to metoda HTTP żądania obsługiwanego przez funkcję oprogramowania pośredniego (takiego jak GET, PUT lub POST) małymi literami.

Rajeev Kumar Verma
źródło
1

W skrócie app.use () obsługuje wszystkie typy żądań [np. Get, post, ...], więc jest najczęściej używany do konfiguracji oprogramowania pośredniego. lub może być używany, gdy trasy i funkcje są rozdzielone

przykład:

app.use("/test",functionName)

a nazwa_funkcji znajduje się w innym pliku

Snivio
źródło
Dzięki za odpowiedź, ale uważam, że wszystkie te informacje są już zawarte w innych odpowiedziach.
Alexander Bird
1

app.use() jest metodą oprogramowania pośredniego.

Metoda oprogramowania pośredniego przypomina przechwytywanie w Javie, ta metoda zawsze wykonuje się dla wszystkich żądań.

Cel i użycie oprogramowania pośredniego: -

  1. Aby sprawdzić, czy sesja wygasła, czy nie
  2. do uwierzytelnienia i autoryzacji użytkownika
  3. sprawdź cookie (data ważności)
  4. przeanalizuj dane przed odpowiedzią
Mohan
źródło
Oprogramowanie pośrednie to funkcja przekazana do app.use ().
NattyC
1

app.use
jest tworzony przez express (framework pośredni nodejs)
app.use służy do wykonywania dowolnego zapytania w procesie inicjowania server.js
(węzeł)
var app = wymagany („ekspresowy”); więc w zasadzie funkcja app.use wywoływana jest przy każdym uruchomieniu serwera
app.use(bodyparser.json())

Piyush Jain
źródło
0

app.use to oprogramowanie pośrednie na poziomie aplikacji

Powiązanie oprogramowania pośredniego na poziomie aplikacji z instancją obiektu aplikacji za pomocą funkcji app.use () i app.METHOD (), gdzie METHOD to metoda HTTP żądania obsługiwanego przez funkcję oprogramowania pośredniego (takiego jak GET, PUT lub POST) małymi literami.

możesz użyć do sprawdzenia wszystkich żądań, na przykład chcesz sprawdzić token / token dostępu, musisz napisać oprogramowanie pośrednie za pomocą app.use, aby sprawdzić token w żądaniu.

Ten przykład pokazuje funkcję oprogramowania pośredniego bez ścieżki montowania. Funkcja jest wykonywana za każdym razem, gdy aplikacja odbierze żądanie.

var app = express()

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

referencja z https://expressjs.com/en/guide/using-middleware.html

Osama Bari
źródło
app.use () nie jest oprogramowaniem pośrednim. Oprogramowanie pośrednie to funkcja przekazana do app.use ()
NattyC
0

app.use (ścieżka, oprogramowanie pośrednie) służy do wywoływania funkcji oprogramowania pośredniego, które należy wywołać, zanim trasa zostanie trafiona dla odpowiedniej ścieżki. Za pomocą aplikacji można wywołać wiele funkcji oprogramowania pośredniego.

app.use ('/ fetch', enforceAuthentication) -> oprogramowanie pośrednie enforceAuthentication fn zostanie wywołane po otrzymaniu żądania zaczynającego się od '/ fetch' . Może to być / fetch / users , / fetch / ids / {id} itp

Niektóre funkcje oprogramowania pośredniego mogą wymagać wywołania niezależnie od żądania. W takich przypadkach ścieżka nie jest określona, ​​a ponieważ domyślną ścieżką jest / i każde żądanie zaczyna się od / , ta funkcja oprogramowania pośredniego zostanie wywołana dla wszystkich żądań.

app.use (() => {// Zainicjuj wspólną usługę})

fn next () należy wywołać w ramach każdej funkcji oprogramowania pośredniego, gdy wiele funkcji oprogramowania pośredniego jest przekazywanych do app.use , w przeciwnym razie następna funkcja oprogramowania pośredniego nie zostanie wywołana.

odniesienie: http://expressjs.com/en/api.html#app.use

Uwaga: dokumentacja mówi, że możemy ominąć funkcje oprogramowania pośredniego następujące po bieżącej, wywołując next ('route') w ramach bieżącej funkcji oprogramowania pośredniego, ale ta technika nie działała dla mnie w app.use, ale działała z app. METODA jak poniżej . Więc fn1 i fn2 zostały wywołane, ale nie 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();
    })
użytkownik3022150
źródło