annuler 2meme requete sur un get [NODEJS] - Javascript/Node.js - Programmation
Marsh Posté le 03-04-2017 à 13:10:59
Tu peux modifier ton service?
http://stackoverflow.com/questions [...] avicon-ico
Marsh Posté le 03-04-2017 à 14:42:34
h3bus a écrit : Tu peux modifier ton service? |
A priori oui.
Ce qui m'étonne c'est que le phénomène ne se produit qu'avec Nodejs:
la même requete faite avec firefox me donne bien les données non dupliquées. (j'ai vérifié avec l'outil de debuggage).
Marsh Posté le 04-04-2017 à 13:00:48
Bonjour,
Je suis intrigué par le soucis. Il n'y a pas de raison que cela n'arrive qu'avec Nodejs.
Peux-tu expliquer d'où vient la variable rest ?
As-tu ajouté un header particulier ?
Et pourquoi ne pas faire comme la doc le propose:
Code :
|
au lieu de
Code :
|
https://nodejs.org/en/docs/guides/a [...] ansaction/
Tor
Marsh Posté le 04-04-2017 à 16:34:29
torwood3 a écrit : Bonjour, |
la variable rest est l'object quicontient des methodes du module restler
https://github.com/danwrong/restler
en fait j'ai essayé avec le module request mais le problème est le même
Marsh Posté le 05-04-2017 à 09:01:32
Bonjour,
Je resigne, ton soucis est vraiment étrange.
Le double appel fais pour récupérer le Favicon est un comportement normal pour les navigateurs. Les modules "request", "http", "restler" et compagnie n'ont aucun raison de l'implémenter car ce n'est pas leur objectif.
En relisant ton code, trois remarques :
- La promise de reslter te retourne qu'une seule variable (data)
- Next est dans ton code une callback (une function), il lui faut donc des parenthèses pour se lancer. (mais elle a pas sa place) - Je n'ai pas vu que "restler" avait implémenté l'évènement "200". J'ai vu que des "complete". J'ai lu !
J'ai l'impression qu'il y a eu une petite confusion sur le type de retour que te propose "reslter". Les deux arguments sont "data", c'est à dire le body de la réponse et "response" qui j'imagine est la requête réponse en entier (header, statusCode and co ...). Il n'y a donc pas de next.
next lorsque tu traites les requêtes reçu par nodejs. Dans ce cas tu as trois argument possible : req, res et next
Mais ici c'est toi qui initie la requête.
Si ton soucis n'est toujours pas réglé, peux-tu tester ce code et me dire l'affichage correspondant dans la console. Merci bien
Code :
|
Edit : Mise en forme
Marsh Posté le 05-04-2017 à 10:26:31
ESSAI 1
script_modifié:
Code :
|
OUTPUT :
Code :
|
----------------------------------------------------------------
autre script
Code :
|
OUTPUT
Code :
|
Essai 2
Code :
|
Resultat
Code :
|
ESSAI 3
Code :
|
Resultat
Code :
|
ESSAi 4
Code :
|
Resultat
Code :
|
Conclusion:
ne serais-ce pas les () à la fin de getDataFromAllCountries qui provoquerait ces doublons de données ?
Mais si je les enlève, rien ne s'affiche
Code :
|
en javascript, je suppose que le ";" est comparable au die() en PHP: on force la fin du script
Marsh Posté le 05-04-2017 à 11:04:05
Salut,
Merci pour les essais.
Le ";" indique la fin d'une instruction. Il est nécessaire lorsqu'il y a plusieurs instruction dans la même ligne mais optionnel sinon.
Toute fois, je t'incite à le mettre
Ca n'a rien a voir avec le die() de php.
On voit clairement que javascript est un langage super tolérant :
Enlève les ";" de tes parenthèse
Code :
|
devient
Code :
|
Quand tu mets un () après un function() {}, tu demandes au code d’exécuter cette fonction à l’instanciation du code. C'est à dire dès que le code est lu par la machine.
Je comprends pas trop le besoin d'exporter toutes ces variables.
Code :
|
Je remarque que le console.log("---------" ); n'est pas toujours affiché même lorsqu'il est présent dans la callback (essai1). Etrange
Tor
Marsh Posté le 05-04-2017 à 11:30:41
[table][tr][td]
[/td][/tr][/table]C'est bien ce qui m'agace avec javascript: son côté ultra permissif, à ajouter à l'ambiguité de certaines fonctions.
Moi qui aime que les choses soient claires, carrées (et la logique de la POO), à ce niveau, javascript est encore pire que PHP .
En fait j'ai été chargé d'implémenter une fonctionnalité d'importation de données dans une application Nodejs existante et développée par des personnes expérimentées (bien plus que moi), mais qui, pour le moment, sont occupées sur un autre projet.
Cette application est très structurée et contient de nombreux fichiers pour bien séparer le rôle des scripts.
En gros l'application comprend des taches pour charger des données venant de webservices (FTP, Json, etc..), les normaliser et les insérer en base de données (NosSQL) via un ORM (mongoose).
C'est pour ca qu'il ya énormément d'exports.
Marsh Posté le 05-04-2017 à 11:54:04
Ouai javascript c'est une vrai saloperie si le code n'est pas bien structuré.
Et pour moi qui vient du C puis POO (java, python), certains concepts sont vraiment obscurs.
Par exemple
Code :
|
Eurk
Marsh Posté le 05-04-2017 à 13:57:33
Merci pour vos explications
maintenant j'ai un autre probleme, qui est d'accéder aux données de ce script:
via un autre script (situé dans un répertoire test)
Code :
|
Resultat: undefined
Marsh Posté le 05-04-2017 à 16:07:59
Ca fonctionne ?
Tu peux expliquer ce que tu exportes ?
Si c'est basé sur le code proposé, le soucis vient de la ligne 8.
Il faut exécuter la fonction "createService".
Et tant qu'on y est, en complément de var on a introduit dans la nouvelle version de JS (ES6) les types "let" et "const"
"let" remplace var pour les variables qui vont être modifié. "const" pour les variables qui ne seront pas modifié (une constante). Pense donc a harmoniser ton code.
Code :
|
Euh ...
Tu t'attends à voir les données affichés avec le console log ?
En basant de ce qui a été montré plus tot (requête get), on se trouve dans une situation asynchrone.
Potentiellement, le console.log va être exécuté AVANT que t'a requête soit fini. Bienvenu en JavaScript
Modulo le faite que tu ne retournes rien de la fonction "getDataFromAllCountries", c'est une source de soucis.
Je pense qu'il va falloir faire un zeste de gymnastique intellectuelle pour introduire l'asynchrone dans ce que tu comptais faire.
La solution la plus simple que je vois, c'est d'utiliser une callback (Sinon, faut regarder les promises, async/wait)
En gros, tu fais un truc comme ca :
Code :
|
et
Code :
|
Pour info
Code :
|
, "arrow function" introduit dans ES6.
Tu vois l'enchainement logique. On donne une callback a exécuter quand la requête se sera exécuté et on propage l'erreur
Et pour vos remarques sur le JS !!! On fait avec ce qu'on a dans les navigateurs hein !
Je vois aussi que les ";" sont aussi présent dans tes imports :
Code :
|
Il y a une raison particulière ?
C'est la première fois que je vois ca.
Code :
|
Marsh Posté le 05-04-2017 à 17:28:29
pour les ; dans les imports
const utils = require("../utils"; );
je sais pas d'où ca vient: j'ai bien cette syntaxe dans mon code
const utils = require("../utils" ) ;
Mais ca avance:
je parviens enfin à récupérer mes données dans le fichier test-monserviceweb-dataprovide.js
par contre je comprends pas ce qu'est le callback done?
C'est un truc natif à node je suppose ?
Un grand merci pour votre aide en tout cas
Marsh Posté le 05-04-2017 à 18:01:19
Code :
|
Marsh Posté le 02-04-2017 à 21:28:52
Bonsoir,
débutant nodejs, je découvre les joies de l'asychrone et des callbacks. Pour le moment je suis confronté à un "probleme" génant après un GET http sur une API Json qui envoie 2 resultat identiques.
Au début j'ai cru à un bug, mais après investigations, ils s'avère donc qu'il sagit d'un comportement normal, puisque le resultat de la première requete contient le favicon et le données et la l2eme, les mêmes données.
J'ai pas mal cherché sur le net avant de poster ici, mais je n'ai pas trouvé de solution satisfaisante (notez que c'est peut-etre moi qui ne parvient pas à l'implémenter correctement ).
Il ya donc next qui est censée passée directement à la 2eme requete, mais malheuresusement ca ne fonctionne pas.
Vous auriez des idées, pour éviter que je reçoive 2 x les mêmes données ?
Peut-on configurer cela sur le server de l'API tant qu'à faire ?
Merci pour vos réponses
Tom