Connexion asynchrone en javascript

Page principale

Répondre à ce message
Auteur: Patrice Karatchentzeff
Date:  
À: GUILDE
Sujet: Connexion asynchrone en javascript
Salut,

Je me tire des balles sur un truc que je considère comme assez
élémentaire... Je veux connecter un font-end écrit en javascript (en
React Native pour être exact) avec un back-end (utilisant Dancer2,
mais cela a peu d'importance).

J'essaie un truc tout con : je veux me connecter avec un login + mot
de passe. Je câble tout en dur pour développer.

J'envoie donc un paquet json contenant le login et le mot de passe au
serveur, à la bonne adresse (route) et ce dernier lit le paquet,
vérifie si l'association est bonne et renvoie connecté si elle est
bonne et déconnecté sinon. Il renvoie un paquet json. Bref, le bon
vieux trucs des années 90.

Le code (en React Native, mais cela ne doit pas trop effrayer) :

const jsonReader = { "login":"xx", "password":"xxx" } // la requête d'envoi

const submitConnectAsync2 = async () => {
    return fetch(
      uriBase + '/connect', { // c'est l'adresse avec la bonne route
    mode: 'no-cors', // beurk... but waiting for a nice workaround
from Dancer2 side!
    method: 'POST',
    headers: {
          'Accept' : 'application/json',
          'Content-Type' : 'application/json',
    },
    body: JSON.stringify(jsonReader),
      })
      .then(response => response.json())
      .then(json => {
    setMessage(json);  // c'est du react, pour mettre à jour une variable
    console.log("Coucou2");
    //return json.ConnectionState;
      })
      .catch(error => {
    console.log("Transaction error:", error);
    console.log("body:", JSON.stringify(jsonReader));
    //console.log("response:", response);
    //console.log("json:", json);
      });
  };


 useEffect(() => {
    submitConnectAsync2();
  }, []);



J'utilise donc une connexion asynchrone. Cela fonctionne bien côté
serveur : il identifie le paquet json, démarre une session et renvoie
la bonne valeur selon le login/mot de passe.

En revanche, je me tire des balles, car selon FF ou Chrome, cela
fonctionne... ou pas ! FF lit bien la requête de retour et Chrome
prétend qu'il ne la voit pas !

Au début, je croyais que Chrome se plantait, car il reconnait bien le
cookie d'initialisation de session, que j'active lorsque j'ai reçu le
bon couple login/mot de passe, côté back-end. Mais en grattant côté
FF, je me rends compte que le code de retour n'est pas vu : le
console.log('Coucou2") n'est jamais exécuté.

En effet, si je développe le code d'erreur, j'ai un bien mystérieux :

Transaction error: SyntaxError: JSON.parse: unexpected end of data at
line 1 column 1 of the JSON data App.js:326

Il semblerait que le code JSON de retour soit miteux, ce qui pourrait
expliquer que Chrome ne le comprenne pas.

Pourtant, le débugueur de FF le lit bien et il correspond exactement à
ce qui est envoyé par le back-end. Le truc est propre côté back-end a
priori (c'est du perl bien robuste...).

Du coup, je suis paumé... Qui a une idée pour me dépanner ? Je
n'aurais jamais imaginé passer des heures sur un truc aussi con...

Merci

PK

-- 
      |\      _,,,---,,_           Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:patrice.karatchentzeff@gmail.com
     |,4-  ) )-,_. ,\ (  `'-'
    '---''(_/--'  `-'\_)