【问题标题】:Passing non-string data in a JQuery ajax POST call在 JQuery ajax POST 调用中传递非字符串数据
【发布时间】:2016-03-01 11:49:29
【问题描述】:

这是我在 SO 和 Google 上经常看到的一个问题,但找不到适合我的案例的实际解决方案,我自己也无法解决。

我正在将数据从 javascript 应用程序发送到 Node js 服务器,用于查询数据库。

通话数据:

var cDate = new Date();
var name = "get";
var method = "POST";
var data = {
        "db": "alerts",
        "params": {
            "selector":{
                "$or": [
                    {
                        "expires.year":{
                            "$gt": cDate.getFullYear()
                        }

                    },
                    {
                        "expires.year":{
                            "$eq": cDate.getFullYear()
                        },
                        "expires.month":{
                            "$gt": (cDate.getMonth()+1)
                        }
                    },
                    {
                        "expires.year":{
                            "$eq": cDate.getFullYear()
                        },
                        "expires.month":{
                            "$eq": (cDate.getMonth()+1)
                        },
                        "expires.day":{
                            "$gte": cDate.getDate()
                        }
                    }
                    ]
                },
    "sort":["created.year:number","created.month:number","created.day:number"]
}
    };

实际调用:

var jqXHR = $.ajax({
    url:baseURL+"/"+name,
    dataType:"json",
    crossDomain:true,
    data:data,
    method:method,
    success: function(data,status,xhr){
        busyIndicator.hide();
        console.log("success, status: "+status);
        console.log("--> RESPONSE: "+JSON.stringify(data));
        if (callbackSuccess!="") window[callbackSuccess](data);
    },
    error:function(xhr,status,err){
        busyIndicator.hide();
        console.log("error, status: "+status);
        console.log(err);
        genericFailure("Errore nella chiamata al service: "+err);           
    }
}); 

一切正常(.ajax 自己“字符串化”我的 JSON 数据)除了日期也被转换为字符串的事实,因此我的后续数据库查询失败(因为数据库试图面对一个字符串与一个数字)。 我已经尝试发送了

parseInt(<value I want to stay a number>)

但当然它不起作用,因为内容稍后会被字符串化。

Here 我读到不可能将数字作为数字发送,我需要在服务器端进行转换,但问题是如果我通过 Postman 进行相同的调用

{
    "db": "alerts",
    "params": {
    "selector":{
        "$or": [
            {
            "expires.year":{
                "$gt": 2016
              }
            },
            {
            "expires.year":{
                "$eq": 2016
              },
            "expires.month":{
                "$gt": 2
              }
            },
            {
            "expires.year":{
                "$eq": 2016
              },
            "expires.month":{
                "$eq": 2
              },
            "expires.day":{
                "$gte": 29
              }
            }
        ]
        },
"sort":["created.year:number","created.month:number","created.day:number","created.hour:number","created.min:number"]
    }
}

一切按计划进行,数字保持不变,因此可能的。

有人知道如何通过我的 javascript POST 调用执行此操作吗?

提前致谢。

更新

在拨打电话之前,我尝试对发送的数据进行字符串化处理:

data:JSON.stringify(data)

服务器端如果我像这样记录它,我可以正确地看到数据

console.log(JSON.stringify(request.body))

但是如果我尝试用它制作一个对象并使用它,即

var bodyStr = JSON.stringify(request.body)
var bodyObj = JSON.parse(bodyStr)
console.log("db is " + bodyObj.db)

我得到“无法读取未定义的属性 'db'”。

如果我尝试在收到请求后直接记录数据,即

console.log(request.body);

我得到 [object Object],如果我尝试解析它而不先对其进行字符串化,我得到 ​​p>

SyntaxError: Unexpected token o

【问题讨论】:

  • 字符串化数据的日期值是否正确?你能看吗?还有什么错误?
  • @SreepathySp 如果我使用 JSON.stringify(data) 后端不再能够解析我发送的数据
  • @richmondwang 不知道你说的正确是什么意思,我正在服务器上记录我的请求,日期的值是纯数字(就像邮递员调用中的数字一样),用引号括起来标记。
  • 您是否尝试将其作为 JSON.stringify(data) 发送,然后在后端解析它?
  • 我做了,我会在我的问题中写下来,谢谢指出。

标签: javascript jquery json ajax post


【解决方案1】:

感谢所有评论的人,由于您在cmets中到处解决,我无法给予您正确的认可。

通过更改代码中的 两个 项,我能够使其工作(数字保持数字):

1) Stringify 发送前的数据

2) 将 contentType 设置为所需的值,在我的例子中是“application/json”

var jqXHR = $.ajax({
    url:baseURL+"/"+name,
    contentType:"json",
    crossDomain:true,
    data:data,
    method:method,
    success: function(data,status,xhr){
        busyIndicator.hide();
        console.log("success, status: "+status);
        console.log("--> RESPONSE: "+JSON.stringify(data));
        if (callbackSuccess!="") window[callbackSuccess](data);
    },
    error:function(xhr,status,err){
        busyIndicator.hide();
        console.log("error, status: "+status);
        console.log(err);
        genericFailure("Errore nella chiamata al service: "+err);           
    }
});

服务器端我可以正确访问对象而无需任何额外的解析/字符串化,例如

var dataBaseName = request.body.db;

最后,正如 Kevin B 指出的,你还需要设置

dataType: "json"

在调用中,如果您希望返回一个对象,否则您将获得一个字符串化的对象。这是“json”,而不是 contentType 的“application/json”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多