Różnica między app.zastosowanie i aplikacja.wsiadaj ekspresowo.js

Jestem trochę nowy w ekspresie i węźle.js, a ja nie mogę rozgryźć różnicy między app.zastosowanie i aplikacja.get. Wygląda na to, że możesz użyć obu do wysyłania informacji. Na przykład:

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

Wydaje się być takie samo jak to:

app.get('/', function (req,res) {
   res.send('Hello');
});
Author: lighter, 2013-03-24

5 answers

app.use() jest przeznaczony do wiązania middleware z Twoją aplikacją. Jest to ścieżka" mount "lub" prefiks " i ogranicza oprogramowanie pośredniczące do stosowania tylko do dowolnych ścieżek, które begin z nim. Może być nawet użyty do osadzenia innej aplikacji:

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

Poprzez podanie / jako ścieżki" mount", app.use() odpowie na każdą ścieżkę zaczynającą się od /, które są wszystkimi i niezależnie od HTTP użyty czasownik:

  • GET /
  • PUT /foo
  • POST /foo/bar
  • itd.

app.get(), Z drugiej strony, jest częścią Express' application routing i jest przeznaczony do dopasowania i obsługi określonej trasy, gdy jest wymagane z GET HTTP czasownik:

  • GET /

I, równoważny routing dla Twojego przykładu app.use() będzie w rzeczywistości:

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

(Update: próba lepszego wykazania różnice.)

Metody routingu, w tym app.get(), są wygodnymi metodami, które pomagają precyzyjniej dopasować odpowiedzi do żądań. Dodają również wsparcie dla funkcji, takich jak parametry i next('route').

Wewnątrz każdego app.get() jest wezwanie do app.use(), więc z pewnością możesz to zrobić bezpośrednio z app.use(). Ale, robi to często wymaga (prawdopodobnie niepotrzebnie) reimplementing różnych ilości kotła kod.

Przykłady:

  • Dla prostych, statycznych tras:

    app.get('/', function (req, res) {
      // ...
    });
    

    Vs.

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
    
  • Z wieloma uchwytami dla tej samej trasy:

    app.get('/', authorize('ADMIN'), function (req, res) {
      // ...
    });
    

    Vs.

    const authorizeAdmin = authorize('ADMIN');
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      authorizeAdmin(req, res, function (err) {
        if (err) return next(err);
    
        // ...
      });
    });
    
  • Z parametrami:

    app.get('/item/:id', function (req, res) {
      let id = req.params.id;
      // ...
    });
    

    Vs.

    const pathToRegExp = require('path-to-regexp');
    
    function prepareParams(matches, pathKeys, previousParams) {
      var params = previousParams || {};
    
      // TODO: support repeating keys...
      matches.slice(1).forEach(function (segment, index) {
        let { name } = pathKeys[index];
        params[name] = segment;
      });
    
      return params;
    }
    
    const itemIdKeys = [];
    const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET') return next();
    
      var urlMatch = itemIdPattern.exec(req.url);
      if (!urlMatch) return next();
    
      if (itemIdKeys && itemIdKeys.length)
        req.params = prepareParams(urlMatch, itemIdKeys, req.params);
    
      let id = req.params.id;
      // ...
    });
    

Uwaga: Express ' implementacja tych funkcji jest zawarta w jego Router, Layer, oraz Route.

 163
Author: Jonathan Lonowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 21:16:53

app.use jest metodą "niższego poziomu" od Connect, od której zależy Framework middleware.

Oto moje wytyczne:

  • Użyj app.get, jeśli chcesz ujawnić metodę GET.
  • Użyj app.use, jeśli chcesz dodać oprogramowanie pośredniczące (obsługę żądania HTTP, zanim dotrze ono do tras skonfigurowanych w programie Express) lub jeśli chcesz, aby Twoje trasy były modułowe (na przykład Udostępnij zestaw tras z modułu npm, który inne aplikacje internetowe mogłyby zastosowanie).
 37
Author: Matthew Ratzloff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 17:45:11

Po prostu app.użyj oznacza "Uruchom to na wszystkich żądaniach"
app.get oznacza "Uruchom to na żądanie GET, dla podanego adresu URL"

 32
Author: Dhyan Mohandas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 09:47:47

app.get jest wywoływana, gdy metoda HTTP jest ustawiona na GET, podczas gdy app.use jest wywoływana niezależnie od metody HTTP i dlatego definiuje warstwę, która znajduje się na wierzchu wszystkich innych typów RESTful, do których pakiety express dają dostęp.

 22
Author: MrLore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 17:38:47

Różnica między app.use & app.get:

app.use → jest on zwykle używany do wprowadzania middlewares w aplikacji i może obsługiwać wszystkie typy żądań HTTP.

app.get → służy tylko do obsługi żądań GET HTTP.

Teraz jest zamieszanie między app.use & app.all. Bez wątpienia jest w nich jedna wspólna rzecz, że oba mogą obsługiwać wszelkiego rodzaju żądania HTTP. Ale są pewne różnice, które zalecają nam korzystanie z aplikacji.Użyj dla middlewares i app.wszystko dla trasy obsługa.

  1. app.use() → wystarczy jedno oddzwonienie.
    app.all() → może przyjmować wiele wywołań zwrotnych.

  2. app.use() sprawdzi tylko, czy url zaczyna się od podanej ścieżki.
    Ale app.all() będzie pasować do całej ścieżki.

Na przykład,

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/author
  1. next() wywołanie wewnątrz app.use() wywoła następny program pośredniczący lub dowolny program obsługujący trasę, ale next() wywołanie wewnątrz app.all() wywoła następny program obsługujący trasę(app.all(), app.get/post/put... itd.) tylko. Jeśli nie ma żadnego oprogramowania pośredniego po, zostanie pominięty. Tak więc wskazane jest, aby umieścić wszystkie middlewares zawsze nad obsługujących trasy.
 4
Author: Ankit Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 17:49:10