2013-03-18 5 views
15

Ich sende eine JSON-Struktur an meinen Node/Express-Server und speichere das Objekt in einer Datenbank. Das Problem ist, dass ich JSON mit Integer und Booleans sende, aber alles wird als Strings gespeichert.Wann wird diese JSON-Struktur in alle Zeichenfolgen konvertiert?

Hier ist mein Knoten/express Code:

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'}); 
    }) 
}); 

Hier ist, wie ich mit jquery bin Posting:

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); 
     } 
    }); 

Die jquery Seite berichtet, dass es { "siteid": 123} gesendet, aber Die Knotenseite meldet, dass sie {"siteid": "123"} erhalten hat.

Wo wird die ganze Zahl in eine Zeichenkette umgewandelt?

+0

Welche Datenbank verwenden Sie? Wie sieht Ihr Modellobjekt aus? –

+2

Ich benutze mongodb, damit es glücklich speichert, was auch immer ich es gebe. –

+0

Das verwende ich auch normal. Verwenden Sie Mungo-Modelle, um die Datenstruktur festzulegen? –

Antwort

10

Ihre Daten werden in eine Zeichenfolge als Produkt des Sendens von Client zu Server konvertiert. Denken Sie daran, dass der Client und der Server nicht in JSON kommunizieren, sondern in Text- oder Binärdaten kommunizieren. Der Server (Express?) Interpretiert die gesendeten Daten implizit als Zeichenfolge, die in JSON konvertiert wird, wenn Sie den Anforderungsheader content-type: application/json einschließen. Sie müssen explizit auf dem Server check und convert eingeben, wenn die Daten in einem bestimmten Format beibehalten werden sollen.

TLDR (Kommentare); Verlassen Sie sich nicht darauf, dass der Client gültige Daten sendet. Säubern Sie es, bevor Sie es in der Datenbank speichern.

+1

Das macht Sinn. Ich komme im Moment dazu, indem ich auf dem Client stringfe und auf dem Server parsiere. Ganzzahlen und Booleans überleben. –

+0

Eigentlich vermute ich, dass express.bodyParser() die Typen verliert. JQuery nicht nur stringify() die Daten und senden Sie es im Körper? Wenn ich dies manuell und parse() auf dem Server mache, behalten meine Integer und Booleans usw. ihre Typen. –

+0

Das ist in Ordnung, seien Sie sich jedoch bewusst, dass Sie auf Herausforderungen und schwer zu findende Fehler stoßen werden, wenn Sie nach dem Wiederherstellen aus einem permanenten Zustand Logik mit oder für diese Daten durchführen! – cjohn

7

Ich lief in das gleiche Problem. jQuery $ .post und $ .ajax konvertieren Ganzzahlen in Zeichenketten, wenn JSON gezeichnet wird. Sie können es überprüfen, indem Sie die Daten auf der Serverseite betrachten. Der Server empfängt etwas wie {"age": "3"}, während Sie eigentlich {"age": 3} möchten.

Die Lösung, die geben jQuery reine Objekte zu vermeiden funktioniert, aber es einen String geben statt:

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

+1

Hinzufügen der oben in den Header funktionierte für mich. Dann serverseitig (Express) habe ich einfach '' 'bodyParser.json()' '' als Middleware zum parsen der JSON und dann '' 'req.body.propName''' und konnte die JSON im richtigen Format bekommen. –

+0

die Lösung funktioniert für mich, Express –

+0

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