#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))
, чтобы проверить, существует ли подписка в файле уже. Очень полезно 🙂