cancel
Showing results for 
Search instead for 
Did you mean: 

Head's Up! These forums are read-only. All users and content have migrated. Please join us at community.neo4j.com.

Verifier l'existance d'un noeud (Node.js et neo4j)

nelson
Node Link

Bonjour à tous, je suis tout nouveau sur le site et depuis quelques jours j'ai découvert et accroché au concept porté par neo4j .
Pour un projet que je mets en place, je développe un système d'authentification avec node.js. la connection avec neo4j-driver se fait sans problème. Cependant, j'ai un soucis lorsque vient le moment de vérifier si un utilisateur ayant le même email que celui entré existe déjà dans la base de données 'MATCH (n:person {mail:{mailParam}}) RETURN n'.
Dans tout les cas un objet "userFound" m'est retourné. J'ai tenté, par la suite, d'isoler le tableau records de l'objet retourné et remplacé la condition 'if (!userFound)' par:
var tabUser = userFound.records;
If (tabUser.lenght < 0){....}
Mais rien y fait. Pour le moment j'ai du mal à détecter mon erreur, peut-être que ma requête est mal formulé (j'ai essayé une autre syntaxe avec le même résultat) .
J'espère que la capture du code illustre bien mes propos.
Je vous remercie d'avance pour votre aide.

4 REPLIES 4

Bonjour nelson,
Est-ce que ta requête Cypher ramène bien un noeud lorsque tu la testes dans le Neo4j Browser avec un email existant ? Est-ce que ton label est Person ou person ? La catégorie de noeuds (label) est sensible à la casse, et en général c'est une bonne pratique de les noter avec une majuscule.
Voir https://neo4j.com/docs/cypher-manual/current/syntax/naming/.
Nicolas

nelson
Node Link

Bonjour Nicolas et merci pour ta reponse. Le nom de label est bien person et non person.
J'ai fait un test dans le navigateur directement, j'y ai créé des noeuds, puis je me suis servi de node pour essayer de les retrouver. Lorsqu il existe, la console retourne un tableau records remplis d'objet, sinon records est vide. Malgré le fait qu'il soit vide, la console m'indique 'user already exist'

Bonjour nelson,

Le problème se situe au niveau du JS.

sessDrive
  .run("MATCH (n:person {mail: {mailParam}}) RETURN n"), {mailParam: adresseMail}))
  .then(function(userfound) {
    ...
  })

userfound est l'objet réponse de la Promise, contenant le résultat de la query ainsi que d'autres informations. Dans ton cas, la valeur qui t'intéresses est dans userfound.records.

Le correct code pourrait être quelque chose comme cela :

sessDrive
  .run("MATCH (n:person {mail: {mailParam}}) RETURN n"), {mailParam: adresseMail}))
  .then(function(res) {
   // on récupère le user (s'il existe) dans le résultat
   userfound = res.records[0]

   done(null, userfound)
  })

Bonjour,

Histoire d'apporter (un peu tard) une explication à ton problème:

Lorsque tu run une requête cypher le then va s'activer si la requête s'est bien passée, donc même si les résultats sont vides ! Dans le catch tu auras uniquement des erreurs de network ou de syntaxe !

Pour vérifier tes résultats et voir si un user a été trouvé tu peux utiliser userFound.records.length. Et pour trouver ton user dedans tu peux boucler sur ton tableau records (même s'il n'y a qu'un résultat il te retournera un tableau).

Donc pour récupérer ton user tu peux faire userFound.records[0], et les données de ton user (comme le mail, le nom/prénom, ...) seront dans userFound.records[0]._fields.

En revanche attention, dans ta question tu mets If (tabUser.lenght < 0){....}, mais la length ne pourra jamais être inférieure à 0 ! C'est toujours soit supérieur (s'il y a des résultats), soit égal à 0 (s'il n'y a rien) !

En espérant que mes explications soient claires, bon courage !

Nodes 2022
Nodes
NODES 2022, Neo4j Online Education Summit

All the sessions of the conference are now available online