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!
4 Réponses :
"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 commevaleur
,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.idC'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.userIdqui 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.
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
"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ésolutionPromise
. Oui, votre exemple defoo
fonctionnera.
(req, res) => {}
est identique (principalement) à une fonction qui ressemble à ceci:function getById(req, res) {...}
req
etres
ne sont que des représentations des valeurs qui seront transmises à cette fonction. Ils auraient tout aussi bien pu être appelés(foo, bar)
.
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.
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
)
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);
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
où 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
.
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
.
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.