creator用XMLHttpRequest的post 发送到express的值变成了req.body的key

最近在做creator小游戏,微信的,然后之前用nodejs弄了个简单的服务器,总感觉自己写的不靠谱,打算换成express,然后前端是使用的XMLHttpRequest发送数据,客户端代码如下:

sendXMLHttpRequest(cmd, req, success_call, faild_call){
        if(!cmd){
            return;
        }
        var xhr = new XMLHttpRequest();
        var url = config.SERVER_URL;
        xhr.onreadystatechange = function () {
            console.log(xhr.readyState, xhr.status, "get");
            if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
                var response = xhr.responseText;
                console.log("request return message:", response);
                let info = JSON.parse(response);
                if(info.status == 1){
                    console.log("do success");
                    if(success_call){
                        success_call(info.data);
                    }
                }else{
                    console.log("do failed");
                    if(faild_call){
                        faild_call();
                    }
                }
            }else if(xhr.readyState == 4){
                console.log("readyState is 4 ... faild");
                if(faild_call){
                    faild_call();
                }
            }
        };
        xhr.open("POST", url, true);
        //发送合适的请求头信息
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req = req ? req : {};
        req.wx_code = this.user_id;
        req.game_id = config.game_id;
        req.cmd_code = cmd;
        let proto_json = JSON.stringify(req);
        xhr.send(proto_json);
    },

服务器换成express之后,奇怪的事情就来了,后端输出req.body,前端传过去的值总是变成了key,然后value始终是空字符串“”,比如前端的值是{"id":2,"name":"user"},那么req.body输出来就是{"{\"id\":2,\"name\":\"user\"}":""},虽然也有办法取出我想要的数据,但是很明显情况不对,于是我上网找这种资料,很少有类似问题的,有也不是使用的XMLHttpRequest,但是大概知道了是因为xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");的原因,需要将这句改成xhr.setRequestHeader("Content-type", "application/json");改完之后执行creator小游戏,就会报出跨域的错误,如下:

creator用XMLHttpRequest的post 发送到express的值变成了req.body的key_第1张图片

当然,之前我用nodejs自己写服务器的时候也会出现这个问题,那时候是服务器加了句response.setHeader("Access-Control-Allow-Origin", "*");就ok了,但是这个就没办法了,想到跨域的问题只会出现在浏览器中,然后我直接用模拟器运行发现这时候req.body输出是正常的值了,可以确认改成xhr.setRequestHeader("Content-type", "application/json");是正确的,然后就是解决这个跨域的问题了,查阅资料的时候发现微信会将XMLHttpRequest等网络请求最后都转换成wx.request,于是我想是不是直接用wx.request不会出现跨域的问题,于是之前的sendXMLHttpRequest函数被我替换成send函数,代码如下:

send(cmd, obj, call_back)
    {
        if(!cmd){
            console.log("cmd is null ...");
        }
        obj = obj ? obj : {};
        obj.game_id = config.game_id;
        obj.user_id = window.Global.user.user_id ? window.Global.user.user_id : "null";
        wx.request({
            url: config.SERVER_URL + cmd,
            method: 'POST',
            data: obj,
            dataType: 'json',
            success: function(res) {
                console.log(res);
                console.log(res.data);
                if(call_back){
                    call_back(res, 0);
                }
            }.bind(this),
            fail: function(res, errCode) { 
                console.log("faild");
                console.log(res);
                errCode = errCode ? errCode : 1;
                if(call_back){
                    call_back(res, errCode);
                }
            }.bind(this),
        });
    },

 修改后果然就没有跨域的问题了,express服务器上收到的req.body也正常了,至此,问题解决。如果是原生环境,那么就是直接把xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");改成xhr.setRequestHeader("Content-type", "application/json");就可以了,微信环境的话直接使用微信提供的wx.request访问,dataType选择json,当然如果你希望在浏览器里使用,我查阅资料好像还要更偏更古老的方法  我这里就不说了。

 

你可能感兴趣的:(cocosCreator)