簡體   English   中英

節點:如何保留舊對象並將新數據推送到文件 Json

[英]Node: How keep old objects and push new data into file Json

如果我的腳本關閉工作,我想從文件 Json 中獲取舊值,然后將新值插入 json 文件中。 我閱讀了文件,然后轉換了 JSON 文件,代碼安全工作,但我有一個問題,它為我打印一次

 const dataFile = fs.readFileSync('data.json', 'utf8') let decodeJson = await JSON.parse(dataFile); decodeJson.table.push({name: 'test'})

此行位於forEach循環內,因此在我想將其寫入同一文件 data.json 后,它應該為每個單詞測試打印 25 行。

 getData.data.forEach(async details => { let currentPage = details.title; const dataFile = fs.readFileSync('data.json', 'utf8') if (dataFile === '') { // check if file json empty try { obj.table.push({ name: details.title }) let encodeJson = await JSON.stringify(obj); fs.writeFileSync("data.json", encodeJson) console.log('file is empty') } catch (err) { console.log(err); } } else { //read data with JSON from file try { let decodeJson = await JSON.parse(dataFile); // i want here keep old values + push new values (details.title) decodeJson.table.push({ name: 'test' }) //fs.writeFileSync('data.json', JSON.stringify(decodeJson)) } catch (err) { console.log(err); } } })

我嘗試了一些嘗試,但失敗了,它仍然只打印一個 object...為什么?

 let data = [] data.push('test') decodeJson.table.push(data)

這是我在控制台日志中得到的結果

 table: [ { name: 'Kimi ga Nozomu Eien' }, { name: 'Kita e.: Diamond Dust Drops' }, { name: 'Loveless' }, { name: 'Blood+' }, { name: 'Re: Cutey Honey' }, { name: 'Solty Rei' }, { name: 'Juuni Kokuki' }, { name: 'Shaman King' }, { name: 'X/1999' }, { name: 'X' }, { name: 'Mahou Sensei Negima,' }: { name, 'Maria-sama ga Miteru' }: { name, 'Boukyaku no Senritsu' }: { name, 'Ima, Soko ni Iru Boku' }: { name, 'Peace Maker Kurogane' }: { name, 'Pita Ten' }: { name, 'Power Stone' }: { name, 'Mononoke Hime' }: { name, 'RahXephon' }: { name, 'Samurai 7' }: { name, 'Scrapped Princess' }: { name. 's.CRY,ed' }: { name, 'Shingetsutan Tsukihime' }: { name, 'Slam Dunk' }: { name, 'Strange Dawn' }, [ 'test' ] ] }

我想要做的目標也是如果腳本停止並重新開始工作。 it returns back the old object that was stored in the Json file + keeps adding a new object from the API i'm still a newbie and learning json so please treat me kindly

forEach循環是同步的

如前所述, JSON.parseJSON.stringify是異步的,因此您不需要為它們使用await

使用await會導致問題: array.prototype.forEach將其參數視為同步 function 並丟棄從它返回的任何值。 實際上,這意味着從提供的async function 返回的任何承諾都將被丟棄,而無需等待 promise 解決。

此外, async function 同步執行await運算符,在第一次在其中執行await運算符時返回 promise。

因此,如果data.json為空,則await

let encodeJson = await JSON.stringify(obj);

在創建data.json內容之前返回 promise 內容,這足以讓forEach循環繼續。 所有剩余的迭代都將執行相同的操作,並且在恢復時將覆蓋上一次迭代中創建的data.json文件。 但是,由於每次迭代都更新了一個外部變量obj ,最后一個版本的data.json應該是正確的。

然而,類似的條件適用於現有數據文件:每次循環迭代讀取現有文件並返回 promise 時

await JSON.parse(dataFile);

被執行,允許下一次迭代繼續並讀取相同的輸入數據並覆蓋上一次迭代寫入的文件。

主要經驗是不要將forEach用於需要在單次迭代中完成的異步工作,也不要在必須同步執行的代碼中使用await

在這種特殊情況下,省略await運算符,保持同步寫入,並在循環 function 聲明之前刪除async應該足以解決問題。 更好的解決方案可能是在開始循環之前讀取data.json一次,在循環結束后寫入一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM