3
votes

NodeJS: comment utiliser des arguments comme req, res, result dans des fonctions?

Je suis assez nouveau dans JS, en particulier Node et Express. Je suis quelques tutoriels sur la façon de construire une API et en même temps sur les fonctionnalités spéciales de JS telles que let / const / var, les fonctions fléchées, etc.

Dans de nombreux tutoriels, j'ai vu des choses comme celle-ci:

req.params.id

Avec: "somecode" étant par exemple une requête get

"result" est-il le nom de la valeur retournée ou est-ce une convention que le développeur JS utilise? Je veux dire par là, est-ce que cela fonctionne par exemple?

req.params.userId 

Aussi pour les variables req, res qu'est-ce que cela signifie?

exports.getById = (req, res) => {
    userModel.findById(req.params.userId).then((result) => {
        res.status(200).send(result);
    });
};

Voici la fonction getById (en utilisant à nouveau le "result"):

app.get("/users/:userId", [
        usersController.getById
    ]);

la méthode getById définie dans le controller needs (req, res), ça veut dire, quand je l'appelle comme le code ci-dessus, les arguments req et res sont implicitement utilisés?

Il a également besoin d'un paramètre:

somecode.then((foo) => {someothercode})

qui est dans le URL de la route, comment passe-t-elle à un autre fichier? J'ai un fichier route.js qui utilise un fichier controller.js qui utilise un model.js. Comment le paramètre passe-t-il de la route au contrôleur?

Et cela ne fonctionnera pas si je change le nom du paramètre correctement? par exemple:

somecode.then((result) => {someothercode})

Désolé pour le long message, j'essaie de comprendre la logique JS pour prendre de bonnes habitudes et écrire du code propre.

Merci!


5 commentaires

Ce ne sont que des noms de variables conventionnels, vous pouvez utiliser les noms de votre choix.


Les noms à gauche de la flèche sont les noms que vous choisissez de donner aux paramètres qui sont passés à la fonction.


@Barmar alors l'ordre des arguments est important dans le cas de (req, res), si je vais comme (res, req) alors res serait la demande et req la réponse?


C'est exactement ça. Express les passe dans un ordre particulier, il est de votre responsabilité de leur donner des noms qui correspondent aux rôles.


app.get (route, requestHandler) est le syntex de la requête http. Dans votre cas, la fonction "usersController.getById" est en fait un gestionnaire de requêtes. Tout gestionnaire de requêtes aura le paramètre (req, res) dans cet ordre spécifique.


4 Réponses :


1
votes

"result" est-il le nom de la valeur renvoyée ou est-ce une convention que le développeur JS utilise? Je veux dire par là, est-ce que cela fonctionne par exemple?

D'après mon expérience, oui - result est souvent utilisé. Souvent, vous verrez quelque chose comme valeur , réponse , mais en fin de compte, cela peut être ce que vous définissez. Je recommanderais de s'en tenir à la convention et de consulter également Didacticiel MDN Promise si vous commencez à comprendre les opérations asynchrones de NodeJS.

Qu'est-ce que cela signifie également pour les variables req, res?

req.params.id

C'est une chaîne middleware . Consultez la documentation Express pour plus d'informations.

la méthode getById définie dans les besoins du contrôleur (req, res), cela signifie-t-il que lorsque je l'appelle comme le code ci-dessus, les arguments req et res sont implicitement utilisés? Il a également besoin d'un paramètre:

req.params.userId 

qui est dans l'url Cela ne fonctionnera pas si je change le nom du paramètre, n'est-ce pas? par exemple:

app.get("/users/:userId", [
        usersController.getById
    ]);

Oui, cela utilise un paramètre nommé. Sans le code complet du routeur, il est difficile de savoir comment la méthode getById est liée à la route définie. La documentation sur le routage express sera probablement un bon début à ce sujet.


1 commentaires

résultat est IMHO une odeur de code. La bonne pratique consiste à donner au résultat d'une promesse un nom significatif: statistiques ou utilisateur ou prix etc. (comme x => x.json () ) J'utiliserais un seul nom de caractère - même règle que le court pour boucles



1
votes

"result" est-il le nom de la valeur retournée ou est-ce une convention que le développeur JS utilise?

result est le nom d'une nouvelle variable que vous créez pour représenter la valeur transmise depuis la résolution Promise . Oui, votre exemple de foo fonctionnera.

(req, res) => {} est identique (principalement) à une fonction qui ressemble à ceci:

function getById(req, res) {...}

req et res ne sont que des représentations des valeurs qui seront transmises à cette fonction. Ils auraient tout aussi bien pu être appelés (foo, bar) .


2 commentaires

Donc, si (req, res) peut être quelque chose, cela signifie que l'ordre de l'argument est important, non? (foo, bar) signifie foo est l'objet de la requête et barre la réponse?


@pida C'est vrai! Les arguments doivent être passés dans l'ordre. Pour contourner cette limitation, vous verrez souvent des fonctions prendre un objet de paires clé / valeur où l'ordre n'est pas pertinent.



1
votes

C'est juste une convention. Notez que le code:

function example (x) {}
example(); // not an error
example(1); // not an error
example(1,2,3,4); // also not an error

Est en fait:

app.get('/say/hello', (rx, tx) => tx.send('Hello'));

Puisque somecode est une promesse, votre fonction peut être appelé avec zéro ou un argument. A vous de nommer cet argument:

somecode.then(function(mango) { /* use mango here */ })

Bien sûr, contrairement à certains autres langages, javascript ne vous oblige pas à nommer votre fonction. Vous pouvez simplement utiliser une fonction (anonyme) sans nom:

function myFunction (foo) {
    // use foo here
}

somecode.then(myFunction);

Les fonctions fléchées est une nouvelle syntaxe vous permettant d'écrire des fonctions anonymes dans un style plus court (elle se comporte également légèrement différemment en ce qui concerne à la portée et à la valeur de this)

Express.js et http.Server

Dans la bibliothèque http.Server de node et le framework Express.js, chaque serveur request appellera une fonction que vous définissez et lui passera deux arguments: l'objet de requête et l'objet de réponse. Les variables req et res ne sont que des conventions que les gens utilisent pour écrire leurs propres fonctions de gestion de requêtes. Vous pouvez les nommer comme vous le souhaitez. Par exemple, vous pouvez préférer utiliser request et response à la place ou rx et tx :

somecode.then(myFunction);

Avec combien d'arguments est-ce que j'écris une fonction de rappel ??

La meilleure façon de savoir est de lire la documentation du module que vous êtes en utilisant. Ce n'est pas le seul moyen de le savoir - vous pouvez bien sûr lire le code source à la place. Mais il est souvent plus facile de lire la documentation. Pour cette raison, les modules javascript ont tendance à avoir une très bonne documentation (sinon ils seraient inutilisables et ignorés par la communauté).

Express.js passera en fait trois arguments à votre callback (pas deux !!) - request , response et next next est une fonction que vous pouvez appeler si vous souhaitez qu'Express continue le traitement au lieu de répondre à la demande. Une caractéristique intéressante de javascript est que vous êtes autorisé à appeler des fonctions avec moins ou plus d'arguments et cela n'est pas considéré comme une erreur de syntaxe:

somecode.then((result) => {someothercode});

Express utilise cette fonctionnalité en appelant toujours votre callback avec trois arguments tout en vous permettant de déclarer ledit callback avec seulement deux arguments si vous n'avez pas besoin du troisième argument suivant .


0 commentaires

1
votes

Il semble que vous ayez du mal à comprendre les fonctions de rappel. Considérez le code suivant, puis ouvrez le code source des packages que vous utilisez. et il semble que vous utilisez express.js

function something(callback) {
  var x = 5;
  var y = 'anything';
  callback(x, y);
}

something(function(req, res) {
  console.log(req);
  console.log(res);
});

la fonction quelque chose est créée et à l'intérieur de cette portée de fonction, var x et y sont créés avec n'importe quel type. puis lorsque nous invoquons ou utilisons quelque chose de fonction, nous transmettons une fonction en tant que variable qui est passée en tant que variable callback alors elle peut être utilisée car c'est une fonction donc nous appelons callback code > avec x et y qui peuvent littéralement être n'importe quelle valeur et pour effet, je renvoie un nombre et une chaîne comme req et res .


0 commentaires