Записывать в файл только в том случае, если данных не существует?

#node.js #json #fs

#node.js #json #ФС

Вопрос:

Я создаю сервер push-уведомлений и сохраняю подписки в файле JSON под названием clients.json . Это работает просто отлично, и я могу использовать fs.writeFile('clients.json', data, callback) , что работает. Проблема, с которой я сталкиваюсь, заключается в том, что при наличии нескольких экземпляров подписки в файле JSON сервер отправляет событие push несколько раз для каждого экземпляра подписки.

Сейчас я пытаюсь записать объект подписки в файл только в том случае, если он еще не существует в файле. Я попробовал следующее:

 if (!JSON.parse(fs.readFileSync('clients.json')).endpoints.includes(subscription)) {  clients.endpoints.push(subscription);  fs.writeFile('clients.json', JSON.stringify(clients), err=gt;{if(err){console.log(err)}}); }  

Мне кажется правильным, но, похоже, его не волнует мое состояние, так как блок кода запускается каждый раз, а подписка вставляется в файл много раз.
Если это поможет, это clients.json :

 {  "endpoints":[  /* Client subscriptions end up in this array */  ] }  

Любая помощь будет очень признательна.

Комментарии:

1. Для подобной проблемы существуют гораздо более подходящие структуры данных, чем плоский файл JSON. Например, многие простые базы данных были бы очень хороши для этого. Кроме того, хранение данных в памяти в виде карты с идентификатором клиента в качестве ключа сделало бы это тривиальным для обновления. Если у вас еще нет клиентской подписки на карте, вы можете добавить ее, а затем обновить формат диска.

Ответ №1:

В js только примитивные типы сравниваются по их значениям. Если subscription это объект любого рода, он вернется false при сравнении с другим объектом, даже если он содержит те же данные, потому что они сравниваются по объекту, на который они ссылаются.

Комментарии:

1. Ах, в этом есть смысл. Каждый subscription из них является объектом JSON, который я храню в файле JSON. Я мог бы запустить JSON.stringify(clients).indexOf(JSON.stringify(subscription)) , чтобы проверить, существует ли подписка в файле уже. Очень полезно 🙂