Problème d'encodage ?

Invalid JSON

a marqué ce sujet comme résolu.

Bonjour. :)

J'essaye d'utiliser un serveur CouchDB via Node.js et j'obtiens une erreur "Invalid JSON" dont je ne comprends pas la source.

Voici mon script :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
var http=require('http');

var dbResponse=function(res,callback) {
    res.setEncoding('utf8');
    res.on('data',function(chunk){
        callback(true,JSON.parse(chunk));
    });
};

var dbRequest=function(method,path,data,callback) {
    var body=JSON.stringify(data);
    console.log(body);
    var req=http.request({
        hostname: 'localhost',
        port: 5984,
        method: method,
        path: path,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': body.length
        }
    },function(res){dbResponse(res,callback);});
    req.on('error',function(e){callback(false,e);});
    req.write(body);
    req.end();
};


var dbPut=function(id,callback,obj) {
    dbRequest('PUT','/webos/'+id,obj,callback);
};

var dbGet=function(id,callback) {
    dbRequest('GET','/webos/'+id,{},callback);
}

var dbModify=function(id,callback,dif) {
    dbGet(id,function(success,res){
        if(!success) callback(false,res);
        else {
            var obj={};
            for(var p in res) {
                obj[p]=res[p];
            }
            for(var p in dif) {
                if(dif.hasOwnProperty(p)) obj[p]=dif[p];
            }
            delete obj['_id'];
            console.log(obj);
            dbPut(id,callback,obj);
        }
    });
};

var callit=function(success,res) {
    if(!success) console.log('ERREUR!!');
    else console.log(res);
}

dbModify('user_0',callit,{
    publicname: 'Raphafl'
});

Ma fonction dbModify effectue donc deux requêtes via l'API HTTP de CouchDB : une requête GET pour récupérer l'objet, sur lequel elle effectue les modifications et qu'elle renvoie dans une requête PUT.

Ce script fonctionne et donne en sortie de console :

1
2
3
4
5
6
7
8
9
{}
{ _rev: '4-b6789613ee60f6141a3a167856ff6c4c',
  publicname: 'Raphafl',
  login: 'raph' }
{"_rev":"4-b6789613ee60f6141a3a167856ff6c4c","publicname":"Raphafl","login":"rap
h"}
{ ok: true,
  id: 'user_0',
  rev: '5-8fe5cef5dda42b0c943798e913fb17fa' }

Aucun problème. Le premier {} correspond à la ligne 12, c'est le JSON.stringify de l'objet vide fourni à dbRequest par dbGet. Le second objet affiché correspond à la ligne 49, c'est un objet (et pas une chaîne JSON), celui qui est modifié comme demandé et que l'on s'apprête à donner à dbPut. Le troisième élément affiché est une chaîne JSON correspondant à la variable body ligne 12, envoyé comme données de la requête HTTP PUT. Le quatrième élément est la réponse JSON-parsée du serveur CouchDB qui indique que l'opération a été effectuée avec succès.

Jusque là tout va bien.

Si je change maintenant la ligne 61 et que j'insère un caractère accentué :

1
publicname: 'Raphaël'

J'obtiens maintenant cette sortie de console :

1
2
3
4
5
6
7
{}
{ _rev: '6-b63dbead996edd9792c68349932afef8',
  publicname: 'Raphaël',
  login: 'raph' }
{"_rev":"6-b63dbead996edd9792c68349932afef8","publicname":"Raphaël","login":"rap
h"}
{ error: 'bad_request', reason: 'invalid_json' }

Le serveur répond que le JSON que je lui ai envoyé (troisième élément affiché dans la console) est invalide, alors que semble-t-il il l'est.

J'ai pensé à un problème d'encodage, j'ai testé à changer le charset dans le header de la requête HTTP avec une ligne 19 comme ceci :

1
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'

Mais même résultat, idem avec utf-16. Je précise que mon script Node.js est encodé en utf-8.

Je ne comprends pas cette erreur, quelqu'un peut-il m'aider ? ^^

Salut !

Je ne pourrais pas t'aider, mais je pense que dans le forum Site Web, il y aurait du monde, je déplace donc ton sujet  ;)

Sinon, les lignes 2 à 4 de la sortie console semblent comprendre une indentation et des retours à la ligne, je ne suis pas sûr que ce soit accepté en JSON formel, c'est peut-être une piste.

+0 -0

Ca a plus sa place dans Site Web en effet, merci. :)

Les lignes 2 à 4 ont des indentations et des retours à la ligne c'est vrai mais l'erreur ne vient pas de là car ça ne correspond pas à du JSON formel mais juste à un objet, que console.log représente sous cette forme.

Bon ce topic ne correspond plus à un besoin puisque j'ai découvert qu'au lieu de foncer tête baissée et de pisser ce code je pouvais utiliser des modules tous faits pour la plupart des SGBD existants dont CouchDB. Mais j'aimerais bien comprendre quand même ! ^^ Si quelqu'un trouve la solution à cette énigme…

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