2013-03-18 39 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