11
votes

Sortez de la chaîne de route spécifique de la route dans Express / Nodejs

J'ai une chaîne de "middleware spécifique à la route" pour cet itinéraire, comme: xxx pré>

[mw1, mw2] code> est spécifique au middleware spécifique à la route / certains / chemin code>. p>

Ceci est différent du middleware à l'échelle du serveur, comme celui-ci: P>

    server.use(mw1);
    server.use(mw2);


0 commentaires

3 Réponses :


18
votes

Vous pouvez appeler suivant ("itinéraire") , comme indiqué sur La référence API Express, Routage de l'application Section :

Les rappels multiples peuvent être donnés, tous sont traités de manière égale et se comporter comme le middleware, avec la seule exception que ces rappels peuvent Invoquer Suivant ('itinéraire') pour contourner le (s) rappel (s) d'itinéraire restant.

exemple xxx


2 commentaires

@ Laconbass ouais, j'ai lu cette section aussi, mais n'était pas vraiment sûre de faire de cela. Comment cela peut-il être utilisé pour résoudre ce problème - dois-je créer un itinéraire appelé / erreur et appeler suivant ('/ erreur'); ?


@bguiz a ajouté un exemple, j'espère que cela aide



1
votes

J'étais sous l'impression que si vous appelez suivant () code> ni d'une réponse dans une fonction de traitement d'itinéraire, Express est juste suspendu. Aussi fwiw je n'ai pas utilisé de tableau, la mine ressemble à serveur.post ('/ certains / chemin', mw1, mw2, fonction (req, respect) {... code>

Quoi qu'il en soit. Une alternative peut être de restructurer votre code afin que vous ne disposez que d'une seule fonction de traitement. Avez-vous une bonne raison pour MW1 et MW2 étant middleware au lieu de fonctions asynchrones régulières de vos appels de manutention? P>

var express = require('express');
var server = express();

var mw1 = function(req, res, callback) {
  // do stuff with req/res if necessary but don't send a response
  if (success) {
    callback(null);
  } else {
    callback('Error');
  }
};

var mw2 = function(req, res, callback) {
  //do other stuff but don't send a response
  if (success) {
    callback(null);
  } else {
    callback('Error');
  }
};

function mwBoth(req, res){
  mw1(req, res, function(err){
    if(err){ return res.send(500) };
    mw2(req, res, function(err){
      if(err){ return res.send(500) };
      // neither had an error
      res.redirect('/some/other/path');
    });
  });
};

server.post('/some/path', mwBoth);


3 commentaires

@ Platon En effet, la syntaxe de tableau est équivalente à la syntaxe non-réseau: Ces rappels peuvent également être passés dans les matrices, ces tableaux sont simplement aplaties lors de la transmission voir ici


@ Platon Je ne sais pas pourquoi vous avez reçu un bowvote, je pense que le vôtre est une réponse parfaitement valide. Cependant, je voudrais personnellement une solution "appropriée", si vous voulez, cela ne dévie pas trop du framework Express, c'est-à-dire quelque chose qui reste sur les principes d'utilisation de connect et suivant , car je suis assez certain que le modèle que je décris n'est pas vraiment aussi rare.


@ Platon, désolé de garder les commentaires à venir, mais oui, je suis d'accord avec votre première affirmation. Je suis surpris que quand une fonction middleware n'appelle pas suivant () , la fonction middleware suivante est toujours appelée. Cela semble être un bogue dans Express, soit moi d'interpréter de manière incorrecte la documentation express '.



2
votes

Un peu plus de bricolage a donné la réponse:

var express = require('express');
var server = express();
var mw1 = function(req, resp, next) {
  //do stuff
  if (success) {
    next();
  } else {
    resp.send(406, 'Invalid because of this');
    req.connection.destroy(); //without calling next()
  }
};
var mw2 = function(req, resp, next) {
  //do stuff
  if (success) {
    next();
  } else {
    resp.send(406, 'Invalid because of that');
    req.connection.destroy(); //without calling next()
  }
};
server.post('/some/path', [mw1, mw2], function(req, resp) {
  //write response
});


4 commentaires

Vous pouvez simplement utiliser réponse.end () et c'est fait. Il n'y a pas besoin de req.connection.destroy () .


@laconbass ah, c'est vrai. Mon cas d'utilisation spécifique, si vous êtes intéressé, deviez mettre fin à la demande si la taille du flux de données dépasse un seuil sain défini par moi. Pour se protéger contre cela, je voulais détruire explicitement la connexion lors de la détection. De plus, si je comprends correctement la documentation Express, Express appelle automatiquement les appels resp.end () lorsque vous appelez resp.Send (... .


Vous devriez changer le titre de la question. Cela répond à comment résilier la demande et non à la sortie de la chaîne de middleware spécifique à la route.


@Laconbass L'objectif était de sortir d'une chaîne de middleware, et cela a été réalisé en terminant la réponse ... Donc, je pense que la question va bien comme ça! Merci pour l'entrée quand même!