Node.js - FileSystem.writeFile возвращает неправильно отформатированный JSON - PullRequest
0 голосов
/ 02 февраля 2020

Таким образом, предпосылка здесь - это сценарий JavaScript, который, помимо прочего, должен поддерживать своего рода "словарь" в виде локального файла JSON, где некоторые определяемые пользователем строки могут быть сопоставлены с ключом (строка) и сериализовано. Сценарий уже зависит от Node.js, и я не пытаюсь все равно запустить его в браузере, поэтому я использую библиотеку FileSystem Node.js. Проблема в том, что когда я пытаюсь сохранить новое определение в этом словаре, используя функцию ниже.

(Также обратите внимание, что только из-за того, как данные передаются в функции-оболочке, в которой эта функция вызывается, аргументы передаются в виде массива строк, а не просто строки «ключ» и «значение». Это сделано намеренно.) поместите это в противоположный пустой диктовку. json:

{
    "A": {
        "def": "the first letter in the alphabet",
        "locked": false,
        "viewlocked": false
    }
}

Когда эта функция сначала вызывается с аргументами com_setdef( ["cedar", "a", "species", "of", "tree"] ), результирующий диктат. json, который ранее был пустым, теперь выглядит так :

"{\r\n\t\"A\": {\r\n\t\t\"def\": \"the first letter in the alphabet\",\r\n\t\t\"locked\": false,\r\n\t\t\"viewlocked\": false\r\n\t}\r\n}"

Так что он не только не сохранил какие-либо новые данные, но и понятия не имею, откуда взялся весь этот другой хлам. Документация Node.js для FileSystem.readFile гласит, что если кодировка не указана, то возвращается необработанный буфер, поэтому я подозревал, что это так, но даже если указан UTF-8, он все равно заполняет JSON с кучей мусора, который я явно не передавал.

Есть некоторые плохие новости - они никогда не заканчивают тем, что возвращают строку «завершено». Вся эта функция вызывается внутри функции-обертки asyn c, которая ожидает строку, возвращаемую этой функцией, чтобы затем сравнить ее длину и убедиться, что она> 0 с str.length > 0. Вместо этого я получаю: (node:89944) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined. Все это делает его похожим на fs.readFile, асинхронный c процесс согласно документации, фактически никогда не завершается. Я думаю.

Так что я явно не знаю, что я ' я делаю. Почему сценарию не удается так эффектно добавить новую строку в файл JSON и сохранить ее?

1 Ответ

0 голосов
/ 02 февраля 2020

Ваша проблема в том, что data, который возвращается из fs.readfile(), является уже строкой. Поэтому, когда вы делаете JSON.parse(JSON.stringify(data)) - вы на самом деле сначала стренифицируете строку, а затем анализируете строковую строку, чтобы получить строку (отсюда и все эти раздражающие \r\n).
Чтобы увидеть это, нужно добавить в ваш код console.log(typeof pDict), который будет печатать string.

Решение: убедитесь, что ваш dict.json имеет хорошо отформатированный JSON, а затем измените на JSON.parse(data) (т.е. без JSON.stringify()) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...