Existe-t-il une différence utile entre app.all('*', ... )
et app.use('/', ...)
dans Node.JS Express?
121
Dans la plupart des cas, ils fonctionneraient de manière équivalente. La plus grande différence est l'ordre dans lequel le middleware serait appliqué:
app.all()
s'attache au routeur de l'application, il est donc utilisé chaque fois que le middleware app.router est atteint (qui gère toutes les routes de méthode ... GET, POST, etc.).AVIS: app.router est obsolète dans express 4.x
app.use()
s'attache à la pile middleware principale de l'application, il est donc utilisé dans l'ordre spécifié par le middleware. par exemple, si vous le mettez en premier, ce sera la première chose à exécuter. Si vous le mettez en dernier (après le routeur), il ne sera généralement pas exécuté du tout.Habituellement, si vous voulez faire quelque chose de manière globale sur toutes les routes, app.use () est la meilleure option. En outre, il a moins de chance de futurs bogues, car express 0.4 supprimera probablement le routeur implicite (ce qui signifie que la position du routeur dans le middleware sera plus importante qu'elle ne l'est actuellement, car techniquement vous n'avez même pas à l'utiliser. maintenant).
next("route")
avecapp.all
, mais pas avecapp.use
.app.use ne prend qu'une seule fonction de rappel et est destiné au middleware. L'intergiciel ne gère généralement pas les demandes et les réponses, (techniquement, ils le peuvent), ils ne traitent que les données d'entrée et les remettent au gestionnaire suivant dans la file d'attente.
app.all prend plusieurs rappels et est destiné au routage. avec plusieurs rappels, vous pouvez filtrer les demandes et envoyer des réponses. C'est expliqué dans Filtres sur express.js
app.use voit uniquement si l'URL commence par le chemin spécifié
app.all correspondra au chemin complet
la source
app.use:
épouvanter:
Regardez cet exemple de code expressJs:
Voici le journal lors de l'accès à la route '/ bonjour':
la source
Avec
app.use()
, le chemin "mount" est dépouillé et n'est pas visible pour la fonction middleware:Les fonctions middleware montées (
express.static
) ne sont pas appelées sauf si lereq.url
contient ce préfixe (/static
), auquel point il est supprimé lorsque la fonction est appelée.Avec
app.all()
, il n'y a pas ce comportement.la source
Oui,
app.all()
est appelé lorsqu'un URI particulier est demandé avec n'importe quel type de méthode de requête (POST, GET, PUT ou DELETE)D'autre part, il
app.use()
est utilisé pour tout middleware que vous pourriez avoir et il se monte sur un préfixe de chemin, et sera appelé à chaque fois qu'un URI sous cette route est demandé.Voici la documentation pour app.all et app.use .
la source
Deux différences, toutes les réponses ci-dessus ne se métissent pas.
Le premier:
app.all
accepte une regex comme paramètre de chemin.app.use
n'accepte PAS de regex.Le second:
app.all(path,handler)
ouapp[method](path,handler)
, celui du gestionnairepath
doit être le même que celui de touspath
. Le chemin de l'application [méthode] est terminé.app.use(path,hanlder)
, si le chemin de l'utilisation est complet, le chemin du hanlder doit être '/'. Si le chemin de l'utilisation est le début du chemin complet, le chemin du gestionnaire doit être le reste du chemin complet.la source
Il y a deux différences principales:
1. correspondance de modèle (réponse donnée par Palani)
2.
next(route)
ne fonctionnera pas dans le corps des fonctions du middleware chargé en utilisantapp.use
. Ceci est indiqué dans le lien de la documentation:Lien: http://expressjs.com/en/guide/using-middleware.html
L'effet fonctionnel de
next('route')
peut être vu à partir de l'exemple suivant:la source