在JQuery ajax POST调用中传递非字符串数据

时间:2016-03-01 11:49:29

标签: javascript jquery json ajax post

这个问题我已经在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)

我得到&#34;无法阅读财产&#39; db&#39;未定义&#34;。

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

console.log(request.body);

我得到[object Object],如果我尝试解析它而不先将其字符串化,我得到

SyntaxError: Unexpected token o

1 个答案:

答案 0 :(得分:0)

感谢所有发表评论的人,因为您在评论中已经解决了这个问题,所以我无法给予您适当的认可。

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

1)在发送之前对数据进行字符串化

2)将 contentType 设置为所需的值,在我的情况下&#34; application / json&#34;

dynamic data = JsonConvert.DeserializeObject(receivedJsonString);
            foreach (dynamic o in data)
            {
                Debug.WriteLine(o.country);
            }

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

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

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

var dataBaseName = request.body.db;

在通话中,如果您希望返回一个对象,否则您将有一个字符串化的对象。这是&#34; json&#34;而不是&#34; application / json&#34;就像是contentType一样。