Поскольку JSON - это текстовый формат, который необходимо читать или записывать одновременно, и его нельзя легко изменить или добавить на месте, вам придется прочитать весь файл или записать весь файл сразу.
Итак, самым простым вариантом будет просто использовать fs.promises.readFile()
и fs.promises.writeFile()
и позволить библиотеке открыть файл, прочитать / записать его и закрыть файл. Открытие и закрытие файла в современной ОС использует преимущества кэширования диска, поэтому, если вы открываете файл, который вы только что открыли, не долго go, это не будет медленной операцией. Кроме того, поскольку nodejs выполняет эти операции во вторичных потоках в libuv, он также не блокирует основной поток nodejs, поэтому, как правило, это не проблема производительности вашего сервера.
Если вы действительно хотели откройте файл один раз и удерживайте его открытым, вы бы открыли его для чтения и записи, используя флаг r+
, например:
const fileHandle = await fsPromises.open(this.path, 'r+');
Чтение всего файла будет простым, поскольку новый объект fileHandle имеет .readFile()
method.
const text = await fileHandle.readFile({encoding 'utf8'});
Для записи всего файла из открытого дескриптора файла, вам нужно будет обрезать файл, затем записать свои байты, затем flu sh буфер записи, чтобы обеспечить последний бит данные попадают на диск и не помещаются в буфер.
await fileHandle.truncate(0); // clear previous contents
let {bytesWritten} = await fileHandle.write(mybuffer, 0, someLength, 0); // write new data
assert(bytesWritten === someLength);
await fileHandle.sync(); // flush buffering to disk