在NetInfo.isConnected更改为true Android后,React-Native提取无法正常工作

问题描述 投票:1回答:1

我正在研究我的React-Native应用程序,我想改进离线交互和它的工作方式。当应用程序加载时,我们会获取API以显示所有需要的信息。但是,当用户离线时,我希望将所有请求保存在队列中,并在网络状态从脱机状态更改为联机状态时触发它们。

即使在启动时网络状态处于联机状态时,提取功能完全正常,但在离线时(正常),我总是有Network request failed。但棘手的标准是在这里:即使NetInfo.isConnected。事件侦听器检测从离线到在线的连接变化,当我们重新触发获取功能时,即使我等待10秒,总是导致Network request failed

我没有任何线索,我会感激一些帮助!

在Dev模式下在Android设备上测试&&在发布模式下在Android设备上测试

以下是代码的相关部分:

获取请求

const   getLastNotification = () =>
{
    console.log('TRYING TO GET LAST NOTIFICATION')
    return (
        fetch(`${API}/getLastNotification`, {
            method: 'GET',
            headers:
            {
                'Content-Type': 'application/json',
                auth:           AUTHCODE
            }
        })
        .then(async (response) =>
        {
            const   json = await response.json();
            return (json)
        })
        .catch(err => onError(err, () => getLastNotification()))
    );
};

const   onError = (err, func) =>
{
    if (err)
        console.warn(err.message);
    setPendingFetch(func);
};

队列

const   PENDING_FETCH = [];

const   getPendingFetch = () => PENDING_FETCH;
const   setPendingFetch = (newFunction) =>
{
    if (!PENDING_FETCH.includes(newFunction))
        PENDING_FETCH.push(newFunction);
};

连接更改处理程序

handleConnectionChange = (isConnected) =>
{
    console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
    if (isConnected)
    {
        const   allPendingFetch = getPendingFetch();

        setTimeout(() =>
        {
            allPendingFetch.forEach(each => each());
        }, 5000);
    }
}

即使有这种handleConnectionChange,它也无法正常工作

handleConnectionChange = (isConnected) =>
{
    console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
    if (isConnected)
    {
        fetch(`${API}/`, {
            method: 'POST',
            headers: {'Content-Type': 'application/json'}
        })
        .catch(err => console.warn(err.message)) //Network request failed
    }
}

谢谢 !

编辑(评论)

好的,经过一些测试,几乎没有更新:在将网络状态更改为在线后的2分钟内,获取请求捕获错误(网络请求失败),然后,在2分钟之后,请求正在运行。很好,但我不希望我的用户等待2分钟......任何想法为什么? :)

react-native fetch
1个回答
0
投票

我通过深入了解Fetch和XMLHttpRequest文件找到了答案。

通过显示一些分步记录,我发现了一个错误:'java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。

为简单起见,这是API上的SSL证书错误。如果您遇到同样的问题,可以在终端中触发此命令

openssl s_client -debug -connect yourdomain.com:443

如果你在输出中有这一行

Verify return code: 21 (unable to verify the first certificate)

这可能是因为CRT文件配置错误。在我的情况下,我的提供商只是通过邮件发送给我两个文件,我不得不去它的网站下载所有文件(3个CRT文件),然后按正确的顺序链接它们(myDomain.crt - AddTrust_External_CA_Root.crt - COMODO_RSA_Certification_Authority.crt )使用此命令

$ cat myDomain.crt AddTrust_External_CA_Root.crt COMODO_RSA_Certification_Authority.crt > myFinalDomain.crt

然后用这个替换我服务器上的CRT文件。

© www.soinside.com 2019 - 2024. All rights reserved.