2013-03-18 40 views
15

我正在向我的節點/快遞服務器發送JSON結構並將該對象保存到數據庫中。問題是我發送帶有整數和布爾值的JSON,但所有內容都保存爲字符串。這個JSON結構何時轉換爲所有字符串?

這裏是我的節點/快遞代碼:

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

這裏是我如何使用jQuery執行POST:

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

jQuery的側報告說,它發送{ 「SITEID」:123},但節點端報告它收到{「siteid」:「123」}。

整數轉換爲字符串在哪裏?

+0

您正在使用什麼數據庫?你的模型對象是什麼樣的? – 2013-03-18 01:59:10

+2

我正在使用mongodb,所以它愉快地存儲我所交的任何東西。 – 2013-03-18 02:01:21

+0

這就是我正常使用的情況。你使用貓鼬模型來設置數據結構嗎? – 2013-03-18 02:02:12

回答

10

將您的數據轉換爲字符串作爲從客戶端發送到服務器的產品。請記住,客戶端和服務器實際上並不是以JSON進行通信,而是以文本或二進制數據進行通信。服務器(Express?)會隱式解釋作爲字符串發送的數據,如果包含content-type: application/json請求標頭,則該字符串將轉換爲JSON。如果希望數據以特定格式保存,則需要明確地在服務器上鍵入檢查和轉換。

TLDR(comments);不要依賴客戶端發送有效數據。在將它保存到數據庫之前清理它。

+1

這很有道理。我現在正在通過在客戶端上進行字符串化並在服務器上進行解析來解決此問題。整數和布爾值存活。 – 2013-03-18 17:07:53

+0

實際上,我懷疑express.bodyParser()正在丟失類型。不jquery只是stringify()數據並將其發送到身體?當我手動執行此操作並在服務器上解析()時,我的整數和布爾值等保持其類型。 – 2013-03-18 17:10:51

+0

這很好,只要注意,如果您在從持久狀態恢復數據之後執行邏輯處理或者在該數據上執行邏輯,您將遇到難題和難以發現的錯誤! – cjohn 2013-03-18 17:12:33

7

我遇到了同樣的問題。 jQuery $ .post和$ .ajax在將JSON字符串化時將整數轉換爲字符串。您可以通過查看服務器端的數據來驗證它。服務器收到類似{「age」:「3」}的內容,而您確實需要{「age」:3}。

的作品是爲了避免給jQuery的純對象,但給它一個字符串,而不是解決辦法:

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

+1

將上面的代碼添加到我的頭文件中。然後服務器端(Express)我只是'''bodyParser.json()'''作爲中間件來解析JSON然後'''req.body.propName''並且能夠以正確的格式獲取JSON。 – 2016-01-21 05:02:25

+0

解決方案爲我工作,Express – 2017-03-01 18:35:55

+0

'app.use(bodyParser.json())' – Moss 2017-03-02 12:57:41