2013-03-18 15 views
15

Sto inviando una struttura JSON al mio nodo/express server e salvando l'oggetto in un database. Il problema è che invio JSON con interi e booleani ma tutto viene salvato come stringhe.Quando questa struttura JSON viene convertita in tutte le stringhe?

Ecco il mio nodo/code espresso:

var express = require('express'); 

var app = express(); 
app.enable("jsonp callback"); 
app.use(express.bodyParser()); 

// allow cross origin scripting to get data from devices directly 
app.all('*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 
    next(); 
}); 

app.post('/departures', function(req, res) { 

/* I started using this to convert back to integers - but need to solve the problem 
    for (var i in req.body.data) { 
     req.body.data[i].siteid = parseInt(req.body.data[i].siteid); 
    } 
*/ 
    console.log('saving data '+JSON.stringify(req.body.data)); 
    positionProvider.save(req.body.data, function(){ 
     res.json({status:'success'}); 
    }) 
}); 

Ecco come mi distacco con jQuery:

var data = [{"siteid":123}]; 

    $.ajax({ 
     type: 'POST', 
     url: serverUrl + '/departures', 
     data: { 
      data: data 
     }, 
     success: function(resp) { 
      alert('saved departure data '+JSON.stringify(data)) 
     }, 
     error: function(err) { 
      console.log('error posting to server...'); 
      console.log(err); 
     } 
    }); 

Il lato jquery riferisce che ha inviato { "siteid": 123}, ma il lato nodo riporta che ha ricevuto {"siteid": "123"}.

Dove viene convertito il numero intero in una stringa?

+0

cosa del database stai usando? Come appare il tuo oggetto modello? –

+2

Sto usando mongodb in modo che memorizzi felicemente tutto ciò che ho a disposizione. –

+0

Anche quello che uso su base normale. Usi i modelli di mangusta per impostare la struttura dei dati? –

risposta

10

I dati vengono convertiti in una stringa come un prodotto di inviarlo dal client al server. Ricorda che il client e il server non comunicano effettivamente in JSON, stanno comunicando in testo o dati binari. Il server (Express?) Interpreta implicitamente i dati inviati come stringa, che viene convertita in JSON se si include l'intestazione della richiesta content-type: application/json. Avrai bisogno esplicitamente di digitare check e convert sul server se vuoi che i dati persistano in un formato specifico.

TLDR (commenti); non fare affidamento sul client per inviare dati validi. Pulirlo prima di salvarlo nel database.

+1

Questo ha senso. In questo momento mi sto aggirando stringendo sul client e analizzando sul server. Interi e booleani sopravvivono. –

+0

In realtà, sospetto che express.bodyParser() stia perdendo i tipi. Non jquery solo stringify() i dati e inviarlo nel corpo? Quando lo faccio manualmente e analizzo() sul server, i miei numeri interi e booleani, ecc. Mantengono il loro tipo. –

+0

Va bene, tieni a mente che ti imbatterai in sfide e bug difficili da trovare se esegui la logica con o su quei dati dopo averlo ripristinato da uno stato persistente! – cjohn

7

Mi sono imbattuto nello stesso problema. jQuery $ .post e $ .ajax converte numeri interi in stringhe quando si specifica JSON. Puoi verificarlo guardando i dati sul lato server. Il server riceve qualcosa come {"age": "3"}, mentre tu vuoi davvero {"age": 3}.

La soluzione che funziona è quello di evitare di dare oggetti puri jQuery, ma dare una stringa invece:

$.ajax({ type:'POST', url: '/api/...', data: JSON.stringify(data), contentType: 'application/json' })

+1

Aggiunta di quanto sopra nell'intestazione ha funzionato per me. Quindi lato server (Express) Ho solo '' 'bodyParser.json()' '' come middleware per analizzare il JSON e quindi '' 'req.body.propName''' ed è stato in grado di ottenere il JSON con il formato corretto. –

+0

la soluzione funziona per me, Express –

+0

'app.use (bodyParser.json())' – Moss

Problemi correlati