2017-08-17 164 views
0

我有fetch()設置從GotoWebinar使用它們的API檢索歷史網絡研討會詳細信息。它返回一個JSON體具有這種結構,對象的數組:fetch()響應截斷大數字

[{ 「webinarKey」:5653814518315977731, 「webinarID」: 「562189251」, 「受試者」: 「樣品網絡研討會」, 「organizerKey」 :100000000000331530 }, { 「webinarKey」:9999814518315977731, 「webinarID」: 「999989251」, 「受試者」: 「樣品網絡研討會」, 「organizerKey」:999900000000331530 }]

我的代碼是在Zapier動作(node.js)和重要位l中實施ooks這樣的:

//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變成字符串,但我不確定如何訪問該對象的所有元素。甚至可能在提取響應中。

回答

1

它與JavaScript中的精度位數有關。在JavaScript中,所有數字都以浮點形式存儲,這與基數2中的科學表示法相似,而不是基數10.有固定數量的位(此例中爲53)可用於表示aa * (2 ** b)。如果您查看Number.MAX_SAFE_INTEGER,可以用53位精度表示的最大整數,您將看到它具有16個基數爲10的數字。您的電話號碼爲19.如果您只是在JavaScript控制檯中鍵入號碼,您將看到它打印出四捨五入的版本(具有16位精度)。如果您需要存儲如此大的數字,通常最好將它們存儲爲字符串。

+0

據我所知,我不能存儲一個很大的數字,它需要轉換爲一個字符串。但是API調用返回一個我無法控制的格式的響應主體。那麼如何訪問響應主體的元素,以便在將它傳遞給.json()之前將它們轉換爲字符串? –

+0

如果您將響應解析爲文本('response.text()'而不是'response.json()'),則可以調用'text.replace(/(「[^」] *「\ s *:\ s *)(\ d {16,})/ g,'$ 1'$ 2'')'用字符串替換所有16位或16位以上的字符串,然後您可以將此文本傳遞給'JSON.parse()' – csander

+0

,那就是訣竅,我希望不要做字符串解析,但它似乎是唯一的方法。 –