2011-08-01 2 views
4

Il semble que si je veux passer à une fonction "suivante" dans Nodejs (et peut-être Javascript en général?) Je ne peux pas passer de paramètres à la fonction suivante.Nodejs et Connect fonctionnalité "suivante"

Voici ce que je veux dire:

app.get('/webpage', SomeFunction, NextFunction); 

function SomeFunction (req, res, next) { 
    // Do things 
    next(); 
} 

function NextFunction (req, res) { 
    // Do other things 
} 

Maintenant, si SomeFunction je devais dire next(req, res); il ne semble pas fonctionner. Il n'arrive jamais à la méthode. Évidemment, je ne peux pas passer directement les paramètres ... mais ma question est pourquoi? Comment la fonction suivante sait-elle quels paramètres utiliser? Est-ce parce qu'ils portent le même nom ou passe-t-il automatiquement les 1er et 2e paramètres? Si NextFunction utilisé blah, bleet au lieu de req, res cela fonctionnerait-il encore?

Répondre

15

Ceci est un aspect intentionnel de la conception de Connect (le middleware node.js qui est responsable de ce comportement). La fonction next que votre middleware reçoit est et non le middleware suivant dans la pile; C'est une fonction que Connect génère qui demande au prochain middleware de le gérer (ainsi que de faire des choses supplémentaires pour gérer des cas spéciaux, comme quand il n'y a pas de "middleware suivant").

Si votre middleware doit retourner une réponse, faites-le. Si ce n'est pas le cas, il est implicite que certains middlewares plus récents devraient retourner une réponse. Si vous devez transmettre des données à cette dernière partie du processus, vous devez l'attacher à une partie appropriée de l'objet de requête req.

Par exemple, le middleware bodyParser fourni est chargé de renseigner req.rawBody et req.body en fonction du contenu du corps de la demande. Le middleware basicAuth fourni remplit req.remoteUser en fonction de l'authentification HTTP.

Ceci est le modèle que vous devriez essayer d'émuler: une pile de middleware, dont chacun fait un élément incrémental de base pour traiter la requête. Si ce que vous essayez de modéliser ne rentre pas dans ce paradigme, alors vous devriez probablement avoir une seule fonction pour gérer la requête, à partir de laquelle vous pouvez appeler toute votre propre logique d'application comme bon vous semble.