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 ?