【问题标题】:fetch() response truncating big numbersfetch() 响应截断大数字
【发布时间】:2018-01-25 07:47:12
【问题描述】:

我有 fetch() 设置来使用他们的 API 从 GotoWebinar 检索历史网络研讨会详细信息。它返回一个具有这种结构的 JSON 体,一个对象数组:

[{ “网络研讨会密钥”:5653814518315977731, “网络研讨会ID”:“562189251”, “主题”:“示例网络研讨会”, “组织者密钥”:100000000000331530 }, { “网络研讨会密钥”:9999814518315977731, “网络研讨会ID”:“999989251”, “主题”:“示例网络研讨会”, “组织者密钥”:999900000000331530 }]

我的代码在 Zapier 动作(node.js)中实现,重要的部分如下所示:

//Handle errors from fetch call
function handleFetchStatus(response){
    console.log('Fetch Response Status: ' + response.status);

    switch(response.status){
        case 200: //Request executed properly
            break;

        default:
            throw Error(response.status + ':' + JSON.stringify(response));
    }

    return response.json();

}

function handleFetchBody(oResponse){
    if (oResponse) {
        console.log('handleFetchBody: ' + JSON.stringify(oResponse));
    }

    callback(null, oResponse);
}


//Send POST request.
fetch(getFetchURL(), getFetchOptions())
    .then(handleFetchStatus)
    .then(handleFetchBody)
    .catch(function(error) {
        callback(error);
    });

我遇到的问题是“webinarKey”这个长数字被从“5653814518315977731”截断为“5653814518315978000”。我相信是 json() 函数不能处理大量数字。

我怎样才能阻止这种情况?

我相信我需要在使用 json() 之前将 webinarKey 转换为字符串,但我不确定如何访问对象的所有元素。这在 fetch 响应中是否可能。

【问题讨论】:

    标签: json node.js long-integer fetch-api truncated


    【解决方案1】:

    这与 JavaScript 中的精度位数有关。在 JavaScript 中,所有数字都存储为浮点数,这就像以 2 为底而不是以 10 为底的科学记数法。a * (2 ** b) 中有固定数量的位(在本例中为 53)可用于表示a。如果您查看Number.MAX_SAFE_INTEGER,可以用 53 位精度表示的最大整数,您会看到它有 16 个以 10 为基数的数字。你的数字是 19。如果你只是在 JavaScript 控制台中输入数字,你会看到它打印出四舍五入的版本(精度为 16 位)。如果您需要存储如此大的数字,通常最好将它们存储为字符串。

    【讨论】:

    • 我知道我无法存储这么大的数字,需要将其转换为字符串。但是 API 调用返回的响应正文的格式我无法控制。那么如何访问响应正文的元素,以便在将它们传递给 .json() 之前将它们转换为字符串?
    • 如果您将响应解析为文本(response.text() 而不是response.json()),您可以调用text.replace(/("[^"]*"\s*:\s*)(\d{16,})/g, '$1"$2"') 将所有16 位或更多位的字符串替换为字符串。然后,您可以将此文本传递给JSON.parse()
    • 谢谢,成功了。我希望不要做字符串解析,但它似乎是唯一的方法。
    猜你喜欢
    • 2010-09-17
    • 2018-04-01
    • 2023-03-29
    • 2015-04-27
    • 2014-08-13
    • 2013-03-02
    • 2014-05-15
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多