RN fetch 在debug和release版本下执行结果不一样(巨巨巨坑!!!!!)

问题描述

    postL(url, data, callback) {
        let formData = new URLSearchParams();
        Object.keys(data).forEach((key)=>{
            if(!(data[key] === undefined) && !(data[key] === null))
                formData.append(key,data[key]);
        });
        let realUrl = baseUrl + url;
        fetch(realUrl, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
            },
            body: formData
        })
            .then(response => {
                if (response.ok) {
                    if(response._bodyText) return JSON.parse(response._bodyText);
                    else return null;
                }
                throw new Error('状态码:'+response.status+'错误信息:'+response._bodyText);
            })
            .then(responseText => {
                callback(responseText);
            })
            .catch(err => {
                alert(err.toString());
            })

    },

此段代码在debug模式下,登陆功能完全没有问题

但在release模式下,后台的返回信息是“username和password不能为空”

这就很奇怪了!!!!

一波三折的寻找原因

找到错误的地方实在是太难了,找了几天,最后将错误定位在了fetch传递FormData格式的数据上。

这样写,release模式ok:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2NNsF6l-1575272645047)(en-resource://database/1822:0)]

这样写,debug模式ok:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2OW3hK0-1575272645048)(en-resource://database/1824:0)]

那要怎么样才能让两个模式都ok呢!

最后发现是因为,debug模式下的FormData跟RN的FormData不是同一个东西。晕!!

https://github.com/jhen0409/react-native-debugger/issues/38

解决办法

在入口文件加入这段代码

GLOBAL.FormData = GLOBAL.originalFormData ? GLOBAL.originalFormData : GLOBAL.FormData;

修改postL(url,data,callback){}

    postL(url, data, callback) {
        let formData = new FormData();
        Object.keys(data).forEach((key) => {
            if (!(data[key] === undefined) && !(data[key] === null))
                formData.append(key, data[key]);
        });
        let realUrl = baseUrl + url;
        fetch(realUrl, {
            method: 'POST',
            body: formData
        })
            .then(response => {
                if (response.ok) {
                    if (response._bodyText) return JSON.parse(response._bodyText);
                    else return null;
                }
                throw new Error('状态码:' + response.status + '错误信息:' + response._bodyText);
            })
            .then(responseText => {
                callback(responseText);
            })
            .catch(err => {
                alert(err.toString());
            })

    },

将URLSearchParams改为FormData;并去删掉headers,因为fetch会自动识别格式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值