2013-10-11 85 views
0

我必須在文件上寫入一些JSON數據。 某些JSON對象必須在程序執行過程中更新,這些更新必須保存在文件中(例如數組中的對象)。Node.js更新文件中的JSON數據

存在一種方法來做到這一點,而不重寫整個文件?

JSON結構:

{ 
    "varA": { 
     "varA1": value, 
     "varA2": value, 
    }, 
    "varB": value, 
    "varC": value, 
    "varD": value, 
    "array": [ 
     { obj1 }, 
     { obj2 }, 
     { obj3 }, 
    ] 
} 
+0

懷疑這一點,我的印象是,FS寫入整個文件或沒有文件。你爲什麼不想重寫它?也許將你的JSON分成多個文件和/或將其存儲在數據或內存中。 – Plato

+0

您可以[寫入任意位置](http://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback)或[附加到文件](http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback)輕鬆地,但是當然你需要知道文件的結構。 – Bergi

+0

在我的測試過程中,我看到如果在寫入過程中關閉服務器,整個文件將變爲空白,失去先前記錄的所有數據。簡單的追加不能工作,因爲應該更新的數據是另一個對象的元素,所以我會有括號問題 –

回答

0

如果你想稍微更復雜的解決方案,檔案管理(但很容易實現),我想:

  1. 創造,而不是試圖重寫現有的新文件文件(每次都有一個新文件名)。我建議使用包含時間戳(可讀或毫秒)的東西。
  2. ,總是尋找最新的文件加載/同步回覆文件
  3. 清除舊文件,當您「找到」當一個較新的一個它成功讀取。如果文件沒有成功讀取,則發生了一些情況。回退到下一個文件,並理想地刪除壞文件。或者,等待一個新文件成功寫入。

這樣,你不必擔心沒有被完全寫入等

0

如果你有一個以上的文件,我會強烈建議您使用MongoDB的,因爲它是它到底是什麼好。

用MongoDB的,你可以做這樣的事情(從docs):

db.books.update({ item: "Divine Comedy" }, 
      { 
       $set: { price: 18 }, // set property value 
       $inc: { stock: 5 }, // increment etc field value 

      }) 

    // add value in array 
    db.bios.update(
    { _id: 1 }, 
    { 
     $push: { awards: { award: "IBM Fellow", year: 1963, by: "IBM" } } 
    } 

UPDATE:還有,既然你提到的文件實際上配置,檢查出什麼咕嚕可以做。例如這個問題的答案Updating file references in a json file via a grunt task

+3

從相對簡單的文件請求到使用數據庫系統?如果MongoDB尚未被使用,那麼這對基礎架構而言可能是一個龐大且複雜(且代價昂貴)的修改。 – WiredPrairie

+0

在這個週末我會研究你的建議,但目前我是WiredPrairie的想法。 –