В принципе, есть два способа прочитать файл .json
в Node.js.
Первый вариант - использовать функцию require
, которую вы обычно используете для импорта файлов .js
,но вы можете использовать его и для .json
файлов:
const packageJson = require('./package.json');
Преимущество этого подхода заключается в том, что вы возвращаете содержимое файла .json
в виде объекта или массива JavaScript, уже проанализированного.Недостаток этого подхода заключается в том, что вы не можете перезагрузить файл в текущем процессе, если что-то изменилось, поскольку require
кэширует содержимое любого загруженного файла, и вам всегда возвращается кэшированное значение.
Ваш второй вариант с точностью до наоборот: он позволяет вам перезагружать вещи, но требует, чтобы вы анализировали файл самостоятельно.Для этого вы используете функцию readFile
модуля fs
:
const fs = require('fs');
fs.readFile('./package.json', { encoding: 'utf8' }, (err, data) => {
const packageJson = JSON.parse(data);
// ...
});
Если вы хотите использовать async
и await
и если вы используете функцию util.promisify
Node.jsВы также можете написать это синхронно, но сохранить асинхронный код:
const fs = require('fs'),
{ promisify } = require('util');
const readFile = promisify(fs.readFile);
(async () => {
const data = await readFile('./package.json', { encoding: 'utf8' });
const packageJson = JSON.parse(data);
// ...
})();
Кроме этого, есть также функция fs.readFileSync
, которая работает синхронно, но вы должны остатьсяв отличие от этого по соображениям производительности вашего программного обеспечения.
Для записи файла JSON единственный вариант - использовать функцию writeFile
модуля fs
, которая в основном работает так же, как и readFile
counterpart:
const fs = require('fs');
const packageJson = { /* ... */ };
const data = JSON.parse(packageJson);
fs.writeFile('./package.json', data, { encoding: 'utf8' }, err => {
// ...
});
Опять же, вы можете использовать функцию util.promisify
, как указано выше, чтобы заставить вещи работать с async
и await
, или вы можете использовать синхронную функцию fs.writeFileSync
(котораяопять же я бы не советовал).