Maison interface Web js tutoriel nodejs fonctionne ensuite dans express

nodejs fonctionne ensuite dans express

Apr 18, 2018 am 11:20 AM
express javascript nodejs

Cette fois, je vais vous présenter nodejs pour fonctionner ensuite en express. Quelles sont les précautions pour que nodejs fonctionne ensuite en express. Ce qui suit est un cas pratique, jetons un coup d'œil.

Je crois que beaucoup de gens ne savent pas grand-chose de next in express dans nodejs. La plupart des gens ne savent pas ce que fait next et dans quelles circonstances il est utilisé. introduction. Si vous êtes intéressé, apprenons à l’utiliser.

Récemment, l'entreprise a utilisé Node pour séparer le front-end et le back-end. Le framework Web utilisé est express, j'ai donc une compréhension approfondie du framework express. J'ai écrit un article sur le routage express il y a quelque temps, mais il semble que ce soit le cas. Il y a une chose importante qui manque dans cet article. Le contenu est le prochain d'Express, donc aujourd'hui, je parlerai du prochain d'Express séparément.

Concernant la suite, je vais l'expliquer principalement à partir de trois points :

  • Quelle est la fonction de next ?

  • Quand devrions-nous l'utiliser ensuite ?

  • Quel est le mécanisme de mise en œuvre interne de next ?

Le rôle du Suivant

Lorsque nous définissons la fonction expressmiddleware, nous définirons le troisième paramètre comme next. Ce next est notre protagoniste aujourd'hui. La fonction suivante est principalement responsable de transmettre le contrôle au middleware suivant si le. La requête n'est pas terminée par le logiciel et next n'est pas appelée, la requête sera suspendue et le middleware défini ultérieurement n'aura aucune chance d'être exécuté.

Quand utiliser Suivant

D'après la description ci-dessus, nous savons déjà que la fonction suivante est principalement utilisée pour garantir que tous les middlewares enregistrés sont exécutés les uns après les autres. Ensuite, nous devrions appeler la fonction suivante dans tous les middlewares, mais il y a un cas particulier si nous définissons le middleware. termine cette requête, donc la fonction suivante ne doit pas être appelée à nouveau, sinon des problèmes pourraient survenir. Jetons un coup d'œil au code

app.get('/a', function(req, res, next) {
  res.send('sucess');
  next();
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
 console.log(404);
 var err = new Error('Not Found');
 err.status = 404;
 next(err);
});
app.use(function(err, req, res, next) {
 res.status(err.status || 500);
 res.render('error', {
  message: err.message,
  error: {}
 });
});
Copier après la connexion

. Envoyer la requête "/a", le journal d'impression de la console est le suivant :

404
GET /a 500 6.837 ms - -
Error: Can't set headers after they are sent.
  at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:345:11)
Copier après la connexion

Pourquoi le code lève-t-il une exception ?C'est parce que nous avons appelé la fonction suivante après res.send.Bien que notre requête ait été terminée, le middleware 404 suivant sera toujours exécuté et le middleware suivant essaiera d'accéder à res. aux en-têtes, donc l'exception ci-dessus sera levée.

Après avoir lu ceci, vous vous posez peut-être une question : si je n'appelle pas la fonction suivante après res.send, le middleware 404 défini plus tard ne sera-t-il jamais exécuté ? Maintenant, nous supprimons le prochain appel de fonction après res.send et envoyons la requête "/xxx", nous constaterons que le middleware 404 est exécuté, (ㄒoㄒ), n'est-ce pas contradictoire avec ce que nous avons dit précédemment, notre personnalisation Le le middleware n'appelle pas ensuite, mais le middleware défini plus tard est toujours exécuté. Pourquoi ? Il semble que nous ne pouvons demander de l'aide qu'au code source~~~

Le mécanisme interne de Next

function next(err) {
  ... //此处源码省略
  // find next matching layer
  var layer;
  var match;
  var route;
  while (match !== true && idx < stack.length) {
   layer = stack[idx++];
   match = matchLayer(layer, path);
   route = layer.route;
   if (typeof match !== 'boolean') {
    // hold on to layerError
    layerError = layerError || match;
   }
   if (match !== true) {
    continue;
   }
   ... //此处源码省略
  }
 ... //此处源码省略
  // this should be done for the layer
  if (err) {
    layer.handle_error(err, req, res, next);
  } else {
   layer.handle_request(req, res, next);
  }
 }
Copier après la connexion

Ce qui précède est le code source de next in express. Afin d'expliquer le problème plus facilement, le code a été supprimé. À partir du code source ci-dessus, nous pouvons constater qu'il y a une boucle while à l'intérieur de la fonction suivante. Chaque boucle supprimera une couche de la pile. Cette couche contient des informations de routage et de middleware, puis la couche et. Le chemin demandé correspondra. Si la correspondance réussit, layer.handle_request sera exécuté et la fonction middleware sera appelée. Mais si la correspondance échoue, la couche suivante (c'est-à-dire le middleware) sera bouclée.

Nous pouvons maintenant expliquer le problème soulevé ci-dessus, pourquoi la fonction suivante n'est pas appelée dans notre middleware personnalisé, mais le middleware 404 suivant sera toujours exécuté car le "/xxx" que nous avons demandé ne correspond pas à celui que nous avons enregistré "/a". achemine le middleware, de sorte que la boucle while continuera à s'exécuter. Si le middleware 404 correspondant réussit, le middleware 404 sera exécuté.

Remarque : Pour les middlewares enregistrés avec app.use, si le paramètre path est vide, sa valeur par défaut est "/", et les middlewares avec un chemin de "/" correspondent à toutes les requêtes par défaut.

Une chose est à souligner en particulier. En effet, lorsque l'on définit un middleware de routage , le troisième paramètre next de la fonction n'est pas le même next que le troisième paramètre next de la fonction lorsque l'on définit un middleware de non-routage. Ce que vous voyez ci-dessus est la prochaine fonction du middleware sans routage, et la prochaine fonction du middleware de routage est comme ceci

function next(err) {
  if (err && err === 'route') {
   return done();
  }
  var layer = stack[idx++];
  if (!layer) {
   return done(err);
  }
  if (layer.method && layer.method !== method) {
   return next(err);
  }
  if (err) {
   layer.handle_error(err, req, res, next);
  } else {
   layer.handle_request(req, res, next);
  }
 }
Copier après la connexion

这个next比上边的那个next要简单很多,它负责同一个路由的多个中间件的控制权的传递,并且它会接收一个参数"route",如果调用next(“route”),则会跳过当前路由的其它中间件,直接将控制权交给下一个路由。

最后有必要再说一说next(err),next(err)是如何将控制权传递到错误处理中间件的,从前边的代码我们知道,当调用next(err)是,express内部会调用layer.handle_error,那我们来看看它的源码

Layer.prototype.handle_error = function handle_error(error, req, res, next) {
 var fn = this.handle;
 if (fn.length !== 4) {
  // not a standard error handler
  return next(error);
 }
 try {
  fn(error, req, res, next);
 } catch (err) {
  next(err);
 }
};
Copier après la connexion

代码中的fn就是中间件函数,express会对fn的参数个数进行判断,如果参数个数不等于4则认为不是错误处理中间件,则继续调用next(err),这样就会进入到下一个中间件函数,继续进行参数个数判断,如此方式一直到某个中间件函数的参数个数是4,就认为找到了错误处理中间件,然后执行此中间件函数。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Express Session实现登录验证功能(附代码)

js面向对象深入理解

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nodejs est-il un framework backend ? Nodejs est-il un framework backend ? Apr 21, 2024 am 05:09 AM

Node.js peut être utilisé comme framework backend car il offre des fonctionnalités telles que des performances élevées, l'évolutivité, la prise en charge multiplateforme, un écosystème riche et une facilité de développement.

Comment connecter Nodejs à la base de données MySQL Comment connecter Nodejs à la base de données MySQL Apr 21, 2024 am 06:13 AM

Pour vous connecter à une base de données MySQL, vous devez suivre ces étapes : Installez le pilote mysql2. Utilisez mysql2.createConnection() pour créer un objet de connexion contenant l'adresse de l'hôte, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données. Utilisez connection.query() pour effectuer des requêtes. Enfin, utilisez connection.end() pour mettre fin à la connexion.

Quelles sont les variables globales dans nodejs Quelles sont les variables globales dans nodejs Apr 21, 2024 am 04:54 AM

Les variables globales suivantes existent dans Node.js : Objet global : global Module principal : processus, console, nécessiter Variables d'environnement d'exécution : __dirname, __filename, __line, __column Constantes : undefined, null, NaN, Infinity, -Infinity

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Apr 21, 2024 am 05:18 AM

Il existe deux fichiers liés à npm dans le répertoire d'installation de Node.js : npm et npm.cmd. Les différences sont les suivantes : différentes extensions : npm est un fichier exécutable et npm.cmd est un raccourci de fenêtre de commande. Utilisateurs Windows : npm.cmd peut être utilisé à partir de l'invite de commande, npm ne peut être exécuté qu'à partir de la ligne de commande. Compatibilité : npm.cmd est spécifique aux systèmes Windows, npm est disponible multiplateforme. Recommandations d'utilisation : les utilisateurs Windows utilisent npm.cmd, les autres systèmes d'exploitation utilisent npm.

Y a-t-il une grande différence entre nodejs et java ? Y a-t-il une grande différence entre nodejs et java ? Apr 21, 2024 am 06:12 AM

Les principales différences entre Node.js et Java résident dans la conception et les fonctionnalités : Piloté par les événements ou piloté par les threads : Node.js est piloté par les événements et Java est piloté par les threads. Monothread ou multithread : Node.js utilise une boucle d'événements monothread et Java utilise une architecture multithread. Environnement d'exécution : Node.js s'exécute sur le moteur JavaScript V8, tandis que Java s'exécute sur la JVM. Syntaxe : Node.js utilise la syntaxe JavaScript, tandis que Java utilise la syntaxe Java. Objectif : Node.js convient aux tâches gourmandes en E/S, tandis que Java convient aux applications de grande entreprise.

Nodejs est-il un langage de développement back-end ? Nodejs est-il un langage de développement back-end ? Apr 21, 2024 am 05:09 AM

Oui, Node.js est un langage de développement backend. Il est utilisé pour le développement back-end, notamment la gestion de la logique métier côté serveur, la gestion des connexions à la base de données et la fourniture d'API.

Comment déployer le projet nodejs sur le serveur Comment déployer le projet nodejs sur le serveur Apr 21, 2024 am 04:40 AM

Étapes de déploiement de serveur pour un projet Node.js : Préparez l'environnement de déploiement : obtenez l'accès au serveur, installez Node.js, configurez un référentiel Git. Créez l'application : utilisez npm run build pour générer du code et des dépendances déployables. Téléchargez le code sur le serveur : via Git ou File Transfer Protocol. Installer les dépendances : connectez-vous en SSH au serveur et installez les dépendances de l'application à l'aide de npm install. Démarrez l'application : utilisez une commande telle que node index.js pour démarrer l'application ou utilisez un gestionnaire de processus tel que pm2. Configurer un proxy inverse (facultatif) : utilisez un proxy inverse tel que Nginx ou Apache pour acheminer le trafic vers votre application

Lequel choisir entre nodejs et java ? Lequel choisir entre nodejs et java ? Apr 21, 2024 am 04:40 AM

Node.js et Java ont chacun leurs avantages et leurs inconvénients en matière de développement Web, et le choix dépend des exigences du projet. Node.js excelle dans les applications en temps réel, le développement rapide et l'architecture de microservices, tandis que Java excelle dans la prise en charge, les performances et la sécurité de niveau entreprise.

See all articles