19

我正在向我的节点/快递服务器发送一个 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 发布的方式:

    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"}。

整数在哪里转换为字符串?

4

2 回答 2

13

作为从客户端发送到服务器的产物,您的数据将转换为字符串。请记住,客户端和服务器实际上并不是以 JSON 进行通信,而是以文本或二进制数据进行通信。服务器(Express?)隐式解释作为字符串发送的数据,如果您包含content-type: application/json请求标头,则将其转换为 JSON。如果您希望数据以特定格式保存,则需要在服务器上明确键入检查和转换。

TLDR(评论);不要依赖客户端发送有效数据。在将其保存到数据库之前对其进行清理。

于 2013-03-18T16:17:16.683 回答
11

我遇到了同样的问题。jQuery $.post 和 $.ajax 在对 JSON 进行字符串化时将整数转换为字符串。您可以通过查看服务器端的数据来验证它。服务器收到类似 { "age": "3" } 的东西,而你真的想要 { "age": 3 }。

有效的解决方案是避免给 jQuery 纯对象,而是给它一个字符串:

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

于 2016-01-06T07:54:22.797 回答