2013-03-18 17 views
15

Wysyłam strukturę JSON do mojego serwera węzła/Express i zapisuję obiekt w bazie danych. Problem polega na tym, że wysyłam JSON z liczbami całkowitymi i boolami, ale wszystko zostaje zapisane jako ciągi.Kiedy ta struktura JSON jest konwertowana na wszystkie łańcuchy?

Oto mój węzeł/kod ekspresowy:

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

Oto jak jestem delegowania z 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); 
     } 
    }); 

Bok jquery informuje, że wysłany { "siteid": 123} ale strona węzła zgłasza, że ​​otrzymała {"siteid": "123"}.

Gdzie jest liczba całkowita przekształcana na ciąg znaków?

+0

Co baza danych używasz? Jak wygląda twój obiekt modelu? –

+2

Używam mongodb, więc z radością przechowuje to, co przekazuję. –

+0

To też używam normalnie. Czy używasz modeli mangusty do ustawiania struktury danych? –

Odpowiedz

10

Twoje dane są konwertowane na ciąg znaków jako produkt wysyłany z klienta na serwer. Pamiętaj, że klient i serwer nie komunikują się w JSON, komunikują się w tekście lub danych binarnych. Serwer (Express?) Niejawnie interpretuje dane wysyłane jako ciąg, który jest konwertowany na JSON, jeśli uwzględnisz nagłówek żądania content-type: application/json. Musisz jawnie wpisać check i convert na serwerze, jeśli chcesz zachować dane w określonym formacie.

TLDR (komentarze); nie polegaj na kliencie, aby przesyłać prawidłowe dane. Wyczyść go przed zapisaniem w bazie danych.

+1

To ma sens. W tej chwili obejmuję to przez wiązanie na kliencie i analizowanie na serwerze. Integers i booleans przetrwają. –

+0

Właściwie podejrzewam, że express.bodyParser() traci typy. Czy jquery nie tylko stringify() danych i wysłać je w treści? Kiedy robię to ręcznie i parsuję() na serwerze, moje liczby całkowite i wartości logiczne itd. Zachowują swoje typy. –

+0

To dobrze, po prostu pamiętaj, że natkniesz się na wyzwania i trudne do znalezienia błędy, jeśli logujesz się z tymi danymi lub na nich po przywróceniu ich z utrzymującego się stanu! – cjohn

7

Wpadłem na ten sam problem. jQuery $ .post i $ .ajax konwertuje liczby całkowite do łańcuchów podczas kompresowania JSON. Możesz to sprawdzić, patrząc na dane po stronie serwera. Serwer otrzymuje coś takiego jak {"age": "3"}, podczas gdy naprawdę chcesz {"age": 3}.

Rozwiązanie to działa jest to, aby uniknąć dając jQuery czystych obiektów, ale nadać mu ciąg zamiast:

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

+1

Dodanie powyższego do nagłówka sprawdziło się. Następnie po stronie serwera (Express) Po prostu '' 'bodyParser.json()' '' jako middleware do parsowania JSON, a następnie '' 'req.body.propName''' i był w stanie uzyskać JSON z poprawnym formatem. –

+0

rozwiązanie działa dla mnie, Express –

+0

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

Powiązane problemy