Problème pour parser data http nodejs

Le problème exposé dans ce sujet a été résolu.

Bonjour à tout le monde :)

Donc voilà je vous explique le soucis, j’ai fais un server tout simple avec nodejs. Sur ce serveur, j’envoi une requête POST par l’intermédiaire de fetch, ensuite je récupère les données transmises.

Et c’est là ou j’ai un soucis, je n’arrive pas à parse le résultat, je l’obtiens en chaîne de caractère

(string) > {"username":"feferger","password":"feferger"}

mais au moment de JSON.parse cette chaîne, j’ai cette erreur : SyntaxError: Unexpected end of JSON input

Je vais vous mettre le code pour plus de clarté.

Cette partie de code est la partie client

var info_json = {
        "username":username,
	"password":password
}

//on envoi les data au serveur
const fetch_login = fetch('URL', {
	method: 'POST',
	body: JSON.stringify(info_json), // The data
	headers: {
		'Access-Control-Allow-Origin': '*',
		'Access-Control-Allow-Methods': 'POST',
		'Content-type': 'application/json'
	}
}).then(function(response) {
      return response.json();
}).then(function(data) {
      var userid = JSON.parse(data);
      console.log(userid);
})

Cette partie de cote et la partie serveur

const fs = require("fs");
const http = require("http");

const routing = [
  "/auth/login"
];

const server = http.createServer(async function (req, res) {

    // Parse the request url
    const reqUrl = url.parse(req.url).pathname

      //AUTH
      if(reqUrl == "/auth/login") {

        let data = [];
    
        req.on("data", d => {

            data.push(d)  

        }).on("end", () => {

            let data_ = Buffer.concat(data).toString();

            console.log("data")
            console.log(data_)
            console.log(typeof(data_))
//ce typeof me renvoi un string

            var parsed = JSON.parse(data_);
//ici je veux parse ce string pour avoir un object mais à ce moment là j'ai une erreur
            console.log(parsed)


            res.statusCode = 201
            res.end(JSON.stringify(data_))
            
        }).on('error', err => {
          //This prints the error message and stack trace to `stderr`.
          console.error(err.stack);
        });;

      }

    
})
// Have the server listen on port 3000
server.listen(3000)

J’ai l’impression que le soucis vient de la variable data_ mais je ne comprend pas pourquoi. J’ai regarder un peu la doc mais je ne vois rien qui pourrait résoudre le problème…hélas.

Merci de m’avoir lu :)

Bonjour,

merci pour ton message :) Alors quand je met que ce code là

console.log("data")
console.log(data_)
console.log(JSON.stringify(data_))
console.log(typeof(data_))

j’obtiens

data
{"username":"feferger","password":"feferger"}
"{\"username\":\"feferger\",\"password\":\"feferger\"}"
string

Par contre quand avec ça

console.log("data")
console.log(data_)
console.log(JSON.stringify(data_))
console.log(typeof(data_))
var parsed = JSON.parse(data_);

j’obtiens

data
3|launch2  | ""
3|launch2  | string

avec l’erreur suivante : SyntaxError: Unexpected end of JSON input qui fait référence à la ligne | var parsed = JSON.parse(data_); |

J’ai du mal à comprendre ce comportement, j’ai l’impression que JSON.parse modifie data_ et le rend vide.

Si vous avez des idées, peut-être un problème lier à la référence de la variable.

On dirais que l’événement end se déclenche avant l’évenement data. Ici on peut lire que ça peut venir de l’absence de données dans le body de la requête POST.

Quelle est la sortie exacte de ce bout de code ? Ça permettrais de voir l’ordre de déclenchement des événements ^^


req.on("data", d => {
  console.log('req data fired!');
  data.push(d)  

}).on("end", () => {
  console.log('req end fired!')
  let data_ = Buffer.concat(data).toString();

  console.log("data")
  console.log(data_)
  console.log(JSON.stringify(data_))
  console.log(typeof(data_))
  //ce typeof me renvoi un string

  var parsed = JSON.parse(data_);
  //ici je veux parse ce string pour avoir un object mais à ce moment là j'ai une erreur
  console.log(parsed)


  res.statusCode = 201
  res.end(JSON.stringify(data_))
            
}).on('error', err => {
  //This prints the error message and stack trace to `stderr`.
  console.error(err.stack);
});
        

Avec le code que tu as donné, j’ai ça en retour dans la console

Image utilisateur
Image utilisateur

Et quand je commente la ligne 16 et 18, j’obtiens ça. j’ai ajouter un console log access login pour avoir le début.

Image utilisateur
Image utilisateur

Code actuel

if(reqUrl == "/auth/login") {

        console.log("Access login")

        let data = [];


        req.on("data", d => {
          console.log('req data fired!');
          data.push(d)  

        }).on("end", () => {

          console.log('req end fired!')
          let data_ = Buffer.concat(data).toString();

          console.log("data")
          console.log(data_)
          console.log(JSON.stringify(data_))
          console.log(typeof(data_))
          //ce typeof me renvoi un string

          //var parsed = JSON.parse(data_);
          //ici je veux parse ce string pour avoir un object mais à ce moment là j'ai une erreur
          //console.log(parsed)


          res.statusCode = 201
          res.end(JSON.stringify(data_))

          console.log("------------------------------")
          
                    
        }).on('error', err => {
          //This prints the error message and stack trace to `stderr`.
          console.error(err.stack);
        });


       

        /*
        ANCIEN CODE

        req.on("data", d => {

            data.push(d)  

        }).on("end", () => {

            let data_ = Buffer.concat(data).toString();

            console.log("data")
            console.log(data_)
            console.log(JSON.stringify(data_))
            console.log(typeof(data_))
            var parsed = JSON.parse(data_);
            //console.log(parsed)

            res.statusCode = 201
            res.end(JSON.stringify(data_))
            
        }).on('error', err => {
          //This prints the error message and stack trace to `stderr`.
          console.error(err.stack);
        });


        */

      }

C’est vraiment bizarre car il passe deux fois sur "Access login" ligne 3 que j’ai ajouter. Je ne comprend pas du tout ce comportement.

De ta deuxième capture on peut deviner qu’aucune donnée n’est récupérée avant que tu tentes de parser ton JSON, puis que tes données arrives dans un deuxième temps/une deuxième requête.

Soit tu arrives à trouver pourquoi ton serveur reçoit une première requête vide (autre logiciel qui tourne sur ton PC ?), soit tu rajoutes une condition pour ne pas tenter de parser dans la variable data_ est vide :|

Ben oui pour le coup je ne comprend pas ce comportement car côté client j’ai qu’un seul appel de la fonction fetch. Et côté serveur il en exécute deux. Je vais essayer de décortiquer plus en détails mais c’est vraiment incohérent. je reviendrais ici si je trouve quelques choses, merci pour ton aide en tout cas:)

Quand je met une condition de vérification si la variable n’est pas vide, je n’ai plus d’erreur.

un bête if(data_ != ""){} pour savoir si data n’est pas vide. Pour le coup je n’y avait pas penser lol merci de m’avoir donner l’idée.

Et tu vois quand je fetch une url sans faire de req.on pour récupérer les données et bien dans ce cas de figure ça ne passe pas deux fois mais bien une seule fois.

Par contre je ne comprend pas pourquoi une fois la variable est vide et l’autres fois elle est pas vide…dans la doc je n’ai rien trouvé de particulier qui pourrait expliquer ce comportement.

Le problème est résolu en tout cas :) Merci pour ton aide Drulac.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte