Readfilesync fs: File system | Node.js v16.1.0 Documentation

Содержание

Сравнение взятия из кэша одного и того же файла с помощью fs.readFileSync и fs.readFile (и чтения множества файлов)

Прочитав статью Episode 8: Interview with Ryan Dahl, Creator of Node.js и комментарии к переводу, я решил протестировать эффективность блокирующей и неблокирующей операции чтения файла в Node.js, под катом таблицы и графики.

UPD: Под катом некоректний бенчмарк. Как правильно указали в комментариях, по сути сравнивается взятие из кэша одного и того же файла с помощью fs.readFileSync и fs.readFile.

UPD2: Статья отредактирована, бенчмарк исправлен, результаты добавлены.

Блокирующая операция (fs.readFileSync одна из таких) предполагает что исполнение всего приложения будет приостановлено пока не связанные с JS на прямую операции не будут выполнены.

Неблокирующие опрации позволяют выполнять не связанные с JS операции асинхронно в параллельных потоках (например, fs.readFile).

Больше об blocking vs non-blocking здесь.

Хоть Node.js исполняется в одном потоке, с помощью child_process или cluster можно распределить исполнение кода на несколько потоков.

Были проведены тесты с параллельным и последовательным чтением закэшированого файла (большого и маленького), а также чтения незакешированых файлов.

Все тесты проходили на одном компьютере, с одним HDD, а иммено:

OS: Ubuntu 16.04

Node.js version: 8.4.0

Processor: AMD Phenom(tm) 9750 Quad-Core Processor

Physical cores: 4

HDD: 2TB 7200rpm 64MB

File system type: ext4

file.txt size: 3.3 kB

bigFile.txt size: 6.5 MB

Результаты для закэшированого файла.

При чтении 3.3 kB файла 10 000 раз









SymbolNameops/secPercents
ALoop readFileSync7.4100%
BPromise chain readFileSync4.4760%
CPromise chain readFile1. 0915%
DPromise.all readFileSync4.5862%
EPromise.all readFile1.6923%
FMultithread loop readFileSync20.05271%
GMultithread promise.all readFile4.9867%

При чтении 3.3 kB файла 100 раз









SymbolNameops/secPercents
ALoop readFileSync747100%
BPromise chain readFileSync64186%
CPromise chain readFile12016%
DPromise.all readFileSync66489%
EPromise. all readFile23832%
FMultithread loop readFileSync1050140%
GMultithread promise.all readFile37250%

При чтении 6.5 MB файла 100 раз









SymbolNameops/secPercents
ALoop readFileSync0.6383%
BPromise chain readFileSync0.6687%
CPromise chain readFile0.6180%
DPromise.all readFileSync0.6687%
EPromise.all readFile0.76100%
FMultithread loop readFileSync0. 83109%
GMultithread promise.all readFile0.81107%

Загрузка процессора при чтении 3.3 kB файла 10 000 раз

Загрузка процессора при чтении 6.5 MB файла 100 раз

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

Следовательно, чтение небольших файлов лучше проводить с помощью fs.readFileSync, а больших файлов с помощью fs.readFile (насколько файл должен быть большой зависит от компьютера и софта).

Для некоторых задач fs.readFileSync может быть предпочтительнее и для чтения больших файлов. Например при длительном чтении и обработке множества файлов. При этом нагрузку между ядрами надо распределять с помощью child_process. Грубо говоря, запустить саму ноду, а не операции в несколько потоков.

UPD2

Ниже данные полученные для при чтении множества незакешированых файлов одинакового размера (3,3kB).

При чтении по 1000 файлов









SymbolNameops/secPercents
ALoop readFileSync8.4774%
BPromise chain readFileSync6.2855%
CPromise chain readFile5.4948%
DPromise.all readFileSync8.0670%
EPromise.all readFile11.05100%
FMultithread loop readFileSync3. 7132%
GMultithread promise.all readFile5.1144%

При чтении по 100 файлов









SymbolNameops/secPercents
ALoop readFileSync79.1985%
BPromise chain readFileSync50.1754%
CPromise chain readFile48.4652%
DPromise.all readFileSync54.758%
EPromise.all readFile92.87100%
FMultithread loop readFileSync80.4686%
GMultithread promise.all readFile92. 1999%

Загрузка процессора при чтении незакешированых файлов небольшая, порядка 20%. Результаты варьируются ± 30%.

По результатам видно что использовать неблокирующий fs.readFile выгоднее.

Пример ситуации чтения файла.

Допустим у нас крутится веб сервер на ноде в одном потоке T1. На сервер одновременно приходит два запроса (P1 и P2) чтения и обработки небольших файлов (по одному на запрос). При использовании fs.readFileSync последовательность исполнения кода в потоке Т1 будет выглядеть так:

P1 -> P2

При использовании fs.readFile последовательность исполнения кода в потоке Т1 будет выглядеть так:

P1-1 -> P2-1 -> P1-2 -> P2-2

Где P1-1, P2-1 — делегирование чтения в другой поток, P1-2, P2-2 — получение результатов чтения и обработка данных.

fs [Амперка / Вики]

Объект реализует работу с SD-картами. Класс написан по аналогии с модулем fs Node.js. Ввиду ограничений платформы, реализовать асинхронные обращения к карте памяти невозможно — все методы работают в синхронном режиме. Для подключения модуля, необходимо воспользоваться командой var fs = require('fs').

Если вам необходимо обрабатывать файлы большого размера, следует использовать класс File. Этот класс поддерживает блочное чтение файлов, что позволит избежать ошибки нехватки памяти.

fs.appendFileSync(fileName, data)

Дописывает в конец файла fileName данные data. Возвращает true при успешной записи или false, если запись не удалась.

fs.appendFile(fileName, data)

Дописывает в конец файла fileName данные data. Возвращает true при успешной записи или false, если запись не удалась. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.appendFileSync.

fs.pipe(source, destination, options)

Возвращает содержимое каталога path в виде массива. Если параметр path не передан — выводится информация о корневом каталоге.

// Настаиваем SPI2
SPI2.setup({mosi:B15, miso:B14, sck:B13});
 
// Подключаем объект работы с файловой системой
var fs = require("fs");
 
// Подключаем SD-карту
E.connectSDCard(SPI2, P4 /*CS*/);
 
// Выводим список файлов в корне карты
print(fs.readdirSync());
 
/*
[
  "System Volume Information",
  "CXT.TXT",
  "1.wav",
  "index.htm",
  "headers.htm",
  "http.htm",
  "htmll.htm",
  "index2.htm",
  "index3.htm",
  "index4.htm",
  "index5.htm",
  "index6.htm",
  "index7.htm",
  "index8.htm",
  "index9.htm",
  "indexP2.htm",
  "indexP1.htm",
  "indexP3.htm",
  "Arduino.raw"
 ]
*/

Возвращает содержимое каталога path в виде массива. Если параметр path не передан — выводится информация о корневом каталоге. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.readdirSync.

fs.readFileSync(fileName)

Функция возвращает содержимое файла fileName или ошибку. Учтите, размер возвращенных данных может занять всю память! Для работы с большими данными используйте класс File.

// Настаиваем SPI2
SPI2.setup({mosi:B15, miso:B14, sck:B13});
 
// Подключаем объект работы с файловой системой
var fs = require("fs");
 
// Подключаем SD-карту
E.connectSDCard(SPI2, P4 /*CS*/);
 
// Выводим список файлов в корне карты
var files = fs.readdirSync();
 
// Выводим информацию, хранящуюся в 3-м файле
print(fs.readFileSync(files[2]));
 
/*
Пример вывода:
test
*/

Возвращает содержимое файла fileName или ошибку. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.readFileSync.

Возвращает объект со свойствами содержащими информацию о файле fileName. Объект имеет свойства:

  • size — размер в байтах

  • dir — путь к файлу

  • mtime — объект Date, содержащий время создания файла
// Настаиваем SPI2
SPI2. setup({mosi:B15, miso:B14, sck:B13});
 
// Подключаем объект работы с файловой системой
var fs = require("fs");
 
// Подключаем SD-карту
E.connectSDCard(SPI2, P4 /*CS*/);
 
// Выводим список файлов в корне карты
var files = fs.readdirSync();
 
// Выводим информацию о 3-м файле
print(fs.statSync(files[2]));
 
/*
Пример выводимой информации
{ "size": 131103, "dir": false,
  "mtime": { "ms": 949366800000 }
 }
*/

Удаляет файл fileName и возвращает true при удачном удалении или false, если удаление не произошло.

Удаляет файл fileName и возвращает true при удачном удалении или false, если удаление не произошло. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.unlinkSync.

fs.writeFileSync(fileName, data)

Записывает в файл fileName данных из параметра data. Если файл существует — он будет перезаписан. Возвращает true в случае успешной записи или ошибку.

// Настаиваем SPI2
SPI2.setup({mosi:B15, miso:B14, sck:B13});
 
// Подключаем объект работы с файловой системой
var fs = require("fs");
 
// Подключаем SD-карту
E.connectSDCard(SPI2, P4 /*CS*/);
 
// Выводим список файлов в корне карты
var files = fs.readdirSync();
 
// Выводим информацию о записи в файл данных
print(fs.writeFileSync(files[2], 'new data'));
 
/*
Пример вывода:
true - если запись была успешной
*/

fs.writeFile(fileName, data)

Записывает в файл fileName данных из параметра data. Так как асинхронность не поддерживается из-за аппаратных ограничений, работает аналогично функции fs.writeFileSync.

Совместимость

Совместимость

njs совместим с
ECMAScript 5.1
(строгий режим) c некоторыми расширениями
ECMAScript 6
и позже.
Совместимость находится в стадии развития.

Описания методов и свойств, доступных только в njs
и не соответствующих стандарту ECMAScript, доступны в
справочнике.
Описания методов и свойств njs,
соответствующих стандарту, доступны в
спецификации
ECMAScript.

Готовая функциональность
  • Логические значения, числа, строки, объекты, массивы,
    функции, конструкторы функций
    (0.3.6)
    и регулярные выражения
  • ES5.1 операторы, ES7 операторы возведения в степень
  • ES5.1 инструкции:
    break,
    catch,
    continue,
    do while,
    else,
    finally,
    for,
    for in,
    if,
    return,
    switch,
    throw,
    try,
    var,
    while,
    инструкции меток (labels) (0.2.8)
  • Свойства Math:

    • ES6:
      E,
      LN10,
      LN2,
      LOG10E,
      LOG2E,
      PI,
      SQRT1_2,
      SQRT2
  • Методы Math:

    • ES6:
      abs,
      acos,
      acosh,
      asin,
      asinh,
      atan,
      atan2,
      atanh,
      cbrt,
      ceil,
      clz32,
      cos,
      cosh,
      exp,
      expm1,
      floor,
      fround,
      hypot,
      imul,
      log,
      log10,
      log1p,
      log2,
      max,
      min,
      pow,
      random,
      round,
      sign,
      sin,
      sinh,
      sqrt,
      tan,
      tanh,
      trunc
  • Свойства Number:

    • ES6:
      EPSILON,
      MAX_SAFE_INTEGER,
      MAX_VALUE,
      MIN_SAFE_INTEGER,
      MIN_VALUE,
      NEGATIVE_INFINITY,
      NaN,
      POSITIVE_INFINITY
  • Методы Number:

    • ES6:
      isFinite,
      isInteger,
      isNaN,
      isSafeInteger,
      parseFloat,
      parseInt
  • Методы экземпляра класса Number:
  • Методы String:

    • ES5. 1:
      fromCharCode
    • ES6:
      fromCodePoint
  • Методы экземпляра класса String:

    • ES5.1:
      charAt,
      concat,
      indexOf,
      lastIndexOf,
      match,
      replace,
      search,
      slice,
      split,
      substr,
      substring,
      toLowerCase,
      trim,
      toUpperCase
    • ES6:
      codePointAt,
      endsWith,
      includes,
      repeat,
      startsWith
    • ES8:
      padEnd,
      padStart
    • ES9:
      trimEnd
      (0.3.4),
      trimStart
      (0.3.4)
    • нестандартные:
      bytesFrom
      (0.2.3),
      fromBytes,
      fromUTF8,
      toBytes,
      toUTF8
  • Методы Object:

    • ES5.1:
      create (поддержка без списка свойств),
      defineProperties (поддержка дескрипторов доступа
      начиная с версии 0. 3.3),
      defineProperty (поддержка дескрипторов доступа
      начиная с версии 0.3.3),
      freeze,
      getOwnPropertyDescriptor,
      getOwnPropertyDescriptors
      (0.3.1),
      getOwnPropertyNames
      (0.3.1),
      getPrototypeOf,
      isExtensible,
      isFrozen,
      isSealed,
      keys,
      preventExtensions,
      seal
    • ES6:
      assign
      (0.3.7)
    • ES8:
      entries
      (0.2.7),
      values
      (0.2.7)
  • Методы экземпляра класса Object:

    • ES5.1:
      hasOwnProperty,
      isPrototypeOf,
      (0.3.0),
      propertyIsEnumerable,
      toString,
      valueOf
    • ES6:
      is
      (0.3.8),
      setPrototypeOf
      (0.3.8)
  • Методы Array:
  • Методы экземпляра класса Array:

    • ES5.1:
      concat,
      every,
      filter,
      forEach,
      indexOf,
      join,
      lastIndexOf,
      map,
      pop,
      push,
      reduce,
      reduceRight,
      reverse,
      shift,
      slice,
      some,
      sort,
      splice,
      unshift
    • ES6:
      copyWithin
      (0. 3.7),
      fill,
      find,
      findIndex
    • ES7: includes
  • Методы ArrayBuffer
    (0.3.8):
  • Методы экземпляра класса ArrayBuffer
    (0.3.8):
  • Конструкторы Typed-array
    (0.3.8):

    • ES6:
      Int8Array,
      Uint8Array,
      Uint8ClampedArray,
      Int16Array,
      Uint16Array,
      Int32Array,
      Uint32Array,
      Float32Array,
      Float64Array
  • Методы экземпляра класса Typed-array
    (0.3.8):

    • ES6:
      copyWithin,
      every
      (0.4.4),
      fill,
      filter
      (0.4.4),
      find
      (0.4.4),
      findIndex
      (0.4.4),
      forEach
      (0.4.4),
      includes
      (0.4.4),
      indexOf
      (0.4.4),
      join,
      lastIndexOf
      (0.4.4),
      map
      (0.4.4),
      reduce
      (0.4. 4),
      reduceRight
      (0.4.4),
      reverse
      (0.4.4),
      set,
      slice,
      some
      (0.4.4),
      sort
      (0.4.2),
      subarray,
      toString
  • Методы Buffer
    (0.4.4):
  • Методы экземпляра класса Buffer:
    (0.4.4):

    • compare,
      copy,
      equals,
      fill,
      includes,
      indexOf,
      lastIndexOf,
      readIntBE,
      readInt8,
      readInt16BE,
      readInt32BE,
      readIntLE,
      readInt8,
      readInt16LE,
      readInt32LE,
      readUIntBE,
      readUInt8,
      readUInt16BE,
      readUInt32BE,
      readUIntLE,
      readUInt8,
      readUInt16LE,
      readUInt32LE,
      readDoubleBE,
      readDoubleLE,
      readFloatBE,
      readFloatLE,
      subarray,
      slice,
      swap16,
      swap32,
      swap64,
      toJSON,
      toString,
      write,
      writeIntBE,
      writeInt8,
      writeInt16BE,
      writeInt32BE,
      writeIntLE,
      writeInt8,
      writeInt16LE,
      writeInt32LE,
      writeUIntBE,
      writeUInt8,
      writeUInt16BE,
      writeUInt32BE,
      writeUIntLE,
      writeUInt8,
      writeUInt16LE,
      writeUInt32LE,
      writeDoubleBE,
      writeDoubleLE,
      writeFloatBE,
      writeFloatLE
  • Методы Promise
    (0. 3.8):
  • Методы экземпляра класса Promise
    (0.3.8):

    • ES6:
      catch,
      finally,
      then
  • Методы экземпляра класса Function:
  • Методы экземпляра класса RegExp:

    • ES5.1:
      exec,
      test,
      toString
  • RegExp
    ES9 именные группы записи (0.3.2)
  • Методы экземпляра класса DataView
    (0.4.4):

    • ES6:
      getFloat32,
      getFloat64,
      getInt16,
      getInt32,
      getInt8,
      getUint16,
      getUint32,
      getUint8,
      setFloat32,
      setFloat64,
      setInt16,
      setInt32,
      setInt8,
      setUint16,
      setUint32,
      setUint8
  • Методы Date:
  • Методы экземпляра класса Date:

    • ES5. 1:
      getDate,
      getDay,
      getFullYear,
      getHours,
      getMilliseconds,
      getMinutes,
      getMonth,
      getSeconds,
      getTime,
      getTimezoneOffset,
      getUTCDate,
      getUTCDay,
      getUTCFullYear,
      getUTCHours,
      getUTCMilliseconds,
      getUTCMinutes,
      getUTCMonth,
      getUTCSeconds,
      toDateString,
      toISOString,
      toLocaleDateString,
      toLocaleString,
      toLocaleTimeString,
      toTimeString,
      toUTCString,
      setDate,
      setFullYear,
      setHours,
      setMinutes,
      setMilliseconds,
      setMonth,
      setSeconds,
      setTime,
      setUTCDate,
      setUTCFullYear,
      setUTCHours,
      setUTCMilliseconds,
      setUTCMinutes,
      setUTCMonth,
      setUTCSeconds
  • Методы JSON:
  • ES5. 1 объект arguments
    (0.2.5)
  • ES6 синтаксис rest параметров (без поддержки деструктуризации)
    (0.2.7)
  • ES5.1 global functions:
    decodeURI,
    decodeURIComponent,
    encodeURI,
    encodeURIComponent,
    isFinite,
    isNaN,
    parseFloat,
    parseInt
  • Объекты Error:
    Error,
    EvalError,
    InternalError,
    RangeError,
    ReferenceError,
    SyntaxError,
    TypeError,
    URIError
  • Функции
    clearTimeout
    и
    setTimeout
    (0.2.0)
  • Методы File system:
    fs.accessSync
    (0.3.9),
    fs.appendFileSync,
    fs.mkdirSync
    (0.4.2),
    fs.readdirSync
    (0.4.2),
    fs.readFileSync,
    fs.realpathSync
    (0.3.9),
    fs.renameSync
    (0.3.4),
    fs.rmdirSync
    (0.4. 2),
    fs.symlinkSync
    (0.3.9),
    fs.unlinkSync
    (0.3.9),
    fs.writeFileSync
  • fs.promises API (0.3.9),
    асинхронная версия файловых методов file system.
  • Методы Crypto
    (0.2.0):
    crypto.createHash,
    crypto.createHmac
  • Методы
    Query String
    (0.4.3):
    querystring.decode,
    querystring.encode,
    querystring.escape,
    querystring.parse,
    querystring.stringify,
    querystring.unescape
  • Методы
    TextDecoder
    (0.4.3):
    encoding,
    fatal,
    ignoreBOM,
    decode
  • Методы
    TextEncoder
    (0.4.3):
    encode,
    encodeInto
  • ES6 поддержка модулей:
    инструкции
    export по умолчанию и
    import по умолчанию
    (0.3.0)
  • ES6 поддержка стрелочных функций
    (0.3.1)
  • Шаблонные строки:
    многострочные литералы, интерполяция выражений, вложенные шаблоны
    (0. 3.2)
  • Глобальные объекты
    (0.3.3):

browserify / brfs: browserify fs.readFileSync () инлайнер статических ресурсов

Преобразование просмотра статических ресурсов fs.readFileSync () и fs.readFile ()

Этот модуль представляет собой плагин для просмотра и синтаксического анализа AST.
для вызовов fs.readFileSync () , чтобы вы могли встроить содержимое файла в свой
связки.

Несмотря на то, что этот модуль предназначен для использования с браузером, в нем нет ничего
особенно специфичен для просмотра, поэтому он должен быть вообще полезен в других
проекты.

для main.js:

 var fs = require ('fs');
var html = fs.readFileSync (__ dirname + '/robot.html', 'utf8');
console.log (HTML); 

и robot.html:

сначала npm установите brfs в свой проект, затем:

в командной строке

  $ browserify -t brfs example / main.js> bundle.js
  

теперь в выходном файле пакета,

 var html = fs. readFileSync (__ dirname + '/robot.html', 'utf8'); 

превращается в:

 var html = " гудок  \ n"; 

или с api

 var browserify = require ('browserify');
var fs = require ('fs');

var b = browserify ('example / main.js ');
b.transform ('brfs');

b.bundle (). pipe (fs.createWriteStream ('bundle.js')); 

асинхронный

Вы также можете использовать fs.readFile () :

 var fs = require ('fs');
fs.readFile (__ dirname + '/robot.html', 'utf8', function (err, html) {
    console.log (HTML);
}); 

Когда вы запускаете этот код через brfs, он превращается в:

 var fs = require ('fs');
process.nextTick (function () {(function (err, html) {
    console.log (HTML);
}) (null, " гудок  \ n")}); 

brfs ищет:

  • фс.readFileSync (pathExpr, enc = null)
  • fs.readFile (pathExpr, enc = null, cb)
  • fs.readdirSync (pathExpr)
  • fs. readdir (pathExpr, cb)

Внутри каждого pathExpr можно использовать
статически анализируемые выражения и
эти переменные и функции:

  • __dirname
  • __ имя файла
  • путь , если вы var path = require ('path') первый
  • требуется.решить ()

Как и node, кодировка по умолчанию — null и вернет буфер .
Если вы хотите, чтобы содержимое файла с различным кодированием для вашего встроенного контента, вы можете
установите enc на 'utf8' , 'base64' или 'hex' .

В асинхронном режиме, когда задан обратный вызов cb , содержимое pathExpr
встроен в исходный код внутри вызова process.nextTick () .

При использовании 'файла' -наблюдателя событий, такого как
watchify, встроенные ресурсы будут
обновляется автоматически.

Если вы хотите использовать этот плагин напрямую, а не через браузер, api
следует.

 var brfs = требуется ('brfs') 

var tr = brfs (файл, параметры)

Возврат сквозного потока tr встраивание fs.readFileSync () содержимого файла
на месте.

При желании вы можете установить, какие опц. Вар. будут использоваться в
статическая оценка аргумента
в дополнение к __dirname и __filename .

opts.parserOpts можно использовать для настройки парсера, который использует brfs,
желудь.

tr.on (‘файл’, функция (файл) {})

Для каждого файла, включенного в fs.readFileSync () или fs.readFile () , tr
экземпляр генерирует событие «файл» с путем файла .

Крошечная программа командной строки поставляется с этим модулем, чтобы упростить отладку.

  использование:

  brfs файл
 
    Встроенный файл `fs. readFileSync () `вызывает из` файла`, распечатывая преобразованный файл
    содержимое в стандартный вывод.

  brfs
  brfs -
 
    Встроенные вызовы fs.readFileSync () из stdin, печать преобразованного файла
    содержимое в стандартный вывод.

  

С npm do:

, затем используйте -t brfs с командой browserify или используйте .transform ('brfs') из
API-интерфейс просмотра.

Поскольку brfs оценивает исходный код статически , вы не можете использовать динамические выражения, которые необходимо оценивать во время выполнения.Например:

 // РАБОТАТЬ НЕ БУДЕТ!
var file = window.someFilePath;
var str = require ('fs'). readFileSync (файл, 'utf8'); 

Вместо этого вы должны использовать более простые выражения, которые могут быть разрешены во время сборки:

 var str = require ('fs'). ReadFileSync (__ dirname + '/file.txt', 'utf8'); 

Еще одна проблема: brfs еще не поддерживает ES-модуль import операторов. См. Brfs-babel для экспериментальной замены, поддерживающей этот синтаксис.

MIT

🐢 Эмуляция узла

Некоторые функции, которые в конечном итоге имитируют Node.js API

🌳 Переменные среды

Parcel использует dotenv для поддержки загрузки переменных среды из файлов .env .

.env файлы должны храниться вместе с package.json , который содержит вашу зависимость parcel-bundler .

Parcel загружает файлов .env с этими конкретными именами для следующих значений NODE_ENV :

действующий .env имена файлов NODE_ENV = * NODE_ENV = тест
.env ✔️ ✔️
.env.local ✔️ ✖️
. env. $ {NODE_ENV} ✔️ ✔️
.env. $ {NODE_ENV} .local ✔️ ✔️

Примечательно:

  • NODE_ENV по умолчанию разработка .
  • .env.local не загружается, если NODE_ENV = test , поскольку тесты должны давать одинаковые результаты для всех
  • Иногда введение нового файла .env не срабатывает сразу. В этом случае попробуйте удалить каталог .cache /.
  • Прямой доступ к объекту process.env не поддерживается, но доступ к конкретным переменным на нем, например process.env.API_KEY , предоставит ожидаемое значение.
  • Используйте встроенный процесс Node.js global, т.е. не выполнять импорт из «процесса» . Если вы используете TypeScript, вы, вероятно, захотите установить @ types / node для его компиляции.

🕳️ Полифиллинг и исключение встроенных узловых модулей

При импорте пакетов (или, что более вероятно, зависимости), таких как crypto , fs или , процесс , Parcel либо автоматически использует один из перечисленных полифиллов, либо исключает этот модуль. Вы можете использовать поле псевдонимов в своем пакете .json

собственный модуль замена npm собственный модуль замена npm
утверждение утверждение процесс процесс / browser.js
буфер буфер punycode punycode
консоль Консоль-просмотр строка запроса querystring-es3
константы константы - просмотр поток читаемый поток
крипто криптографический просмотр string_decoder string_decoder
домен домен-браузер системный утилит / утилит. js
событий событий таймеры таймеры-просмотр
http поток-http терминал tty-браузер
https https-браузер URL url
ос os-browserify / browser.js , утилита утилит / утилит.js
путь путь-просмотр vm vm-браузер
злиб browserify-zlib

📄 Встраивание fs.readFileSync

Вызовы fs.readFileSync заменяются содержимым файла, если путь к файлу статически определяется и находится внутри корня проекта

  • fs.readFileSync (..., "utf8") : с константами в виде строки с (или любой другой допустимой кодировкой)
  • fs. readFileSync (...) : объект Buffer (например, Buffer.from (....) вместе с потенциально необходимым полифилом)

построить index.js

index.js :

  импорт фс из «фс»; 
импортировать путь из «пути»;

const data = fs.readFileSync (path.join (__ dirname, "data.json"), "utf8");
консоль.журнал (данные);

data.json :

  {
"foo": "bar"
}

🔧 Отключение этих функций

Встраивание переменных среды и вызовов readFileSync можно отключить с помощью ключа @ parcel / transformer-js в пакете package.json :

package.json :

  {
"name": "my-project",
"dependencies": {
...
},
"@ parcel / transformer-js": {
"inlineFS": false,
"inlineEnvironment": ложный
}
}

inlineEnvironment также может быть массивом глобальных строк:

  {
"name": "my-project",
"dependencies": {
. ..
},
"@ parcel / transformer-js": {
"inlineEnvironment": ["SENTRY_ *"]
}
}

inlineFS применяется к вызовам readFileSync и inlineEnvironment от до process.env.SOMETHING :

  {
inlineFS: boolean,
inlineEnvironment: boolean | Массив
}

(Эта функция обеспечивается @ parcel / transformer-js и @ parcel / resolver-default .)

Отредактируйте эту страницу на GitHub

FS API

Интерфейс:

Файловая система

API файловой системы обеспечивает возможность чтения и записи файлов.

Он разработан, чтобы быть совместимым с API файловой системы Node.js.

  импорт {readFileSync} из «фс»;
let text = readFileSync ("my_file.txt", "utf-8");
console.log (текст);
  

Узнайте больше об этом API в
Руководство по файловой системе

existsSync ()

Новое в SDK 4. 0

Проверить, существует ли данный путь и доступен ли он через
файловая система.

fs.existsSync (путь: строка)

Параметры

путь : строка

Имя пути для проверки на наличие.

writeFileSync ()

Записать данные в файл за одну операцию. Если файл с таким именем
уже существует, он перезаписан; в противном случае создается новый файл.

fs.writeFileSync (имя файла: строка, данные: ArrayBuffer | ArrayBufferView)

Параметры

имя файла : строка

Имя файла для записи.

данные : ArrayBuffer или ArrayBufferView

Если кодировка не указана, данных — это буфер двоичных данных.
С кодировкой == "ascii" или "utf-8" , data — это строка, которая будет
сериализован с соответствующей кодировкой. С кодировкой == "cbor" или
"json" , data — это объект, который будет сериализован с помощью CBOR или
Кодировка JSON соответственно.

фс.writeFileSync (имя файла: строка, данные: строка, кодировка: «ascii» | «utf-8»)

Параметры

имя файла : строка

данные : строка

кодировка : "ascii" или "utf-8"

fs.writeFileSync (имя файла: строка, данные: любые, кодировка: «cbor» | «json»)

Параметры

имя файла : строка

данные : любые

кодировка : "cbor" или "json"

readFileSync ()

Прочитать весь файл в буфер за одну операцию.

fs.readFileSync (имя файла: строка)

Параметры

имя файла : строка

Имя файла для чтения.

fs.readFileSync (имя файла: строка, кодировка: «ascii» | «utf-8»)

Параметры

имя файла : строка

кодировка : "ascii" или "utf-8"

fs.readFileSync (имя файла: строка, кодировка: «cbor» | «json»)

Параметры

имя файла : строка

кодировка : "cbor" или "json"

renameSync ()

Переименовать файл.

fs.renameSync (oldFilename: string, newFilename: string)

Параметры

oldFilename : строка

Имя файла, который нужно переименовать.

новое Имя файла : строка

Имя, на которое следует изменить имя файла.

unlinkSync ()

Удалить файл.

fs.unlinkSync (имя файла: строка)

Параметры

имя файла : строка

Имя удаляемого файла.

statSync ()

Получить метаданные файла.

fs.statSync (имя файла: строка)

Параметры

имя файла : строка

Имя файла, метаданные которого запрашиваются.

writeSync ()

Записать буфер в файл, указанный в fd .

fs.writeSync (fd: number, buffer: ArrayBuffer, offset ?: number | undefined, length ?: number | undefined, position ?: number | undefined)

Параметры

fd : номер

Дескриптор файла для записи.

буфер : ArrayBuffer

Буфер, содержащий данные для записи.

(необязательно) смещение : число или не определено

Смещение в буфере первого байта данных для записи.
(по умолчанию: 0 )

(необязательно) длина : число или не определено

Количество байтов для записи. (по умолчанию: размер буфера)

(необязательно) позиция : номер или неопределенный

Смещение от начала файла, в котором данные
должно быть написано.Если файл был открыт в режиме добавления ( a или a + ),
этот параметр игнорируется.

readSync ()

Прочитать данные из файла, указанного в fd .

fs.readSync (fd: number, buffer: ArrayBuffer, offset ?: number | undefined, length ?: number | undefined, position ?: number | undefined)

Параметры

fd : номер

Дескриптор файла для чтения.

буфер : ArrayBuffer

Буфер для хранения считанных данных.

(необязательно) смещение : число или не определено

Смещение в буфере первого байта, в котором находятся данные файла
для хранения. (по умолчанию: 0 )

(необязательно) длина : число или не определено

Число байтов для чтения. (по умолчанию: размер буфера)

(необязательно) позиция : номер или неопределенный

Смещение от начала файла, из которого данные
следует читать.(по умолчанию: 0 )

closeSync ()

Закройте дескриптор файла.

fs.closeSync (fd: number)

Параметры

fd : номер

Дескриптор файла для закрытия.

openSync ()

Откройте файл.

Имена файлов представляют собой плоские имена без иерархии и не могут содержать путь
разделители (/) или префиксы.

Имя файла — это непустая строка длиной до 64 символов

Допустимые символы для имен файлов: a z , A Z , 0 9 , ! , # ,
долларов США, % , и , ', (, ) , - , @ , ^ , _ , {, ~ , ~ , . ,

Зарезервированные имена . и .. нельзя использовать в качестве имен файлов.

fs.openSync (имя файла: строка, флаги: «r» | «r +» | «w» | «w +» | «a» | «a +»)

Параметры

имя файла : строка

Имя файла для открытия.

флаги : «r» или «r +», или «w», или «w +», или «a», или «a +»

Флаги, определяющие режим открытия файла.

  • r : открыть файл для чтения. Выдается ошибка, если файл
    не существует.
  • r + : Откройте файл для чтения и записи. Выдается ошибка, если
    файл не существует.
  • w : открыть файл для записи. Файл создается, если он не
    существует или усечен, если это так.
  • w + : открыть файл для чтения и записи. Файл создается, если он
    не существует или усечен, если это так.
  • a : Откройте файл для добавления. Файл создается, если он не
    существовать.
  • a + : Откройте файл для чтения и добавления. Файл создается, если
    не существует.

listDirSync ()

Новое в SDK 2.0

Метод инициирования процесса нерекурсивного перечисления всех элементов в
данный каталог.

fs.listDirSync (путь: строка)

Параметры

путь : строка

Путь для чтения.

Интерфейс:

DirectoryIteratorResult

DirectoryIteratorResult

Недвижимость
только для чтения

выполнено

логическое

логическое значение, указывающее, закончили ли мы повторение

только чтение

значение

строка или неопределенная

имя текущей записи каталога или не определено, если выполнено, верно

Интерфейс:

DirectoryIterator

Справочник

Методы

следующая ()

Возвращает: DirectoryIteratorResult

Получить следующую запись каталога

Интерфейс:

FileStats

Метаданные файла

Недвижимость
только для чтения

mtime

Дата

Время последнего изменения данных файла.

только для чтения

размер

номер

Размер файла в байтах.

Как читать и записывать файлы JSON в Node.js

JSON (JavaScript Object Notation) — популярный формат для обмена данными между приложениями, написанными на разных языках. В приложениях Node.js JSON стал удобным выбором для хранения данных благодаря его единообразию и простоте.

Node.js предоставляет несколько встроенных модулей, упрощающих работу с данными JSON.Из этой статьи вы узнаете:

Чтение из файла JSON

Прежде чем я углублюсь в подробности чтения файла JSON, давайте сначала создадим новый файл JSON с именем databases.json , который содержит следующие данные JSON:

database.json

  [
    {
        "name": "MySQL",
        "тип": "СУБД"
    },
    {
        "name": "MongoDB",
        "тип": "NoSQL"
    },
    {
        "name": "Neo4j",
        "тип": "БД графика"
    }
]
  

База данных .json — это простой файл, хранящийся на диске, который содержит массив объектов JSON. Наша цель — прочитать этот файл и распечатать записи на консоли.

Чтобы прочитать данные JSON из указанного выше файла, вы можете использовать собственный модуль fs . Этот модуль предоставляет методы для чтения, записи и просмотра файлов, а также многие другие функции для взаимодействия с файловой системой. Поскольку это нативный модуль, вам не нужно ничего устанавливать. Просто импортируйте его в свой код, вызвав const fs = require ('fs') .

Модуль fs предоставляет нам два метода: fs.readFile () и fs.readFileSync () , которые можно использовать для чтения данных из файла. Обе эти функции делают одно и то же — читают файлы с диска. Единственная разница заключается в том, как эти функции выполняются на самом деле.

Прочтите файл JSON с помощью

fs.readFile ()

Метод fs.readFile () считывает данные из файла асинхронно. Он не блокирует выполнение цикла событий при чтении файла.Вместо этого элемент управления перемещается на следующую строку для выполнения оставшихся строк кода. Как только данные файла становятся доступными, fs.readFile () вызывает функцию обратного вызова, переданную ей в качестве аргумента.

Чтобы прочитать данные JSON из файла databases.json с помощью метода fs.readFile () , просто передайте имя файла, необязательный тип кодировки и функцию обратного вызова для получения данных файла:

  const fs = require ('fs');

фс.readFile ('./ databases.json', 'utf8', (err, data) => {

    if (err) {
        console.log (`Ошибка чтения файла с диска: $ {err}`);
    } еще {

        
        const базы данных = JSON.parse (данные);

        
        database.forEach (db => {
            console.log (`$ {db.name}: $ {db.type}`);
        });
    }

});
  

Int в приведенном выше примере, поскольку метод fs.readFile () возвращает данные в виде строки JSON, мы должны использовать JSON.parse () , чтобы преобразовать его в объект JSON.Наконец, мы используем цикл forEach () для печати всех баз данных на консоли.

Вот вывод вышеуказанного кода:

  MySQL: СУБД
MongoDB: NoSQL
Neo4j: БД графиков
  

Прочтите файл JSON с помощью

fs.readFileSync ()

Метод fs.readFileSync () считывает данные из файла синхронно. В отличие от fs.readFile () , он блокирует выполнение цикла событий до тех пор, пока не будут загружены все данные из файла.

Вместо передачи метода обратного вызова вы передаете только имя файла в fs.readFileSync () , как показано ниже:

  const fs = require ('fs');

пытаться {

    const data = fs.readFileSync ('./ databases.json', 'utf8');

    
    const базы данных = JSON.parse (данные);

    
    database.forEach (db => {
        console.log (`$ {db.name}: $ {db.type}`);
    });

} catch (err) {
    console.log (`Ошибка чтения файла с диска: $ {err}`);
}
  

Хотя fs.readFileSync () имеет чистый синтаксис, вы никогда не должны использовать его для чтения больших файлов, поскольку он блокирует выполнение цикла событий и может существенно повлиять на производительность приложения.Это полезно только для чтения файлов конфигурации при запуске приложения перед выполнением любых других задач.

Чтение файла JSON с помощью

require ()

Наконец, последний способ чтения файла JSON — использование глобального метода require () . Этот подход аналогичен тому, что вы используете для загрузки модулей Node.js, но он также работает для загрузки файлов JSON.

Все, что вам нужно сделать, это передать путь к файлу JSON методу require () , и он синхронно прочитает и проанализирует файл JSON и вернет объект JSON, готовый к использованию:

  const databases = require ('./databases.json ');


database.forEach (db => {
    console.log (`$ {db.name}: $ {db.type}`);
});
  

Метод require () работает точно так же, как fs.readFileSync () — синхронное чтение файла, но это глобальный метод, который можно вызывать из любого места. Более того, он автоматически анализирует содержимое файла в объект JavaScript.

Однако у использования метода require () есть несколько недостатков:

  1. Читает файл только один раз и кэширует данные; требуя его снова, просто вернув кешированные данные.
  2. Файл должен иметь расширение .json . Без правильного расширения метод require () не будет рассматривать его как файл JSON.

Из-за вышеуказанных ограничений require () подходит только для загрузки статических файлов конфигурации, которые не часто меняются. Вместо этого для чтения динамического файла, такого как databases.json , следует использовать метод fs.readFile () .

Запись в файл JSON

Прямо как фс.readFile () и fs.readFileSync () , модуль fs предоставляет еще две функции для записи файлов данных: fs.writeFile () и fs.writeFileSync () .

Как следует из названий, метод fs.writeFileSync () записывает данные в файл синхронно, а fs.writeFile () записывает данные в файл асинхронно.

Запись в файл JSON с использованием

fs.writeFile ()

Чтобы записать JSON в файл, используя fs.writeFile () , просто передайте путь к файлу для записи данных, строку JSON, которую вы хотите записать, необязательный тип кодирования и функцию обратного вызова, которая будет выполняться после записи файла.

Обратите внимание, что если файл еще не существует, он будет создан; если он существует, он будет перезаписан!

Вот пример:

  const fs = require ('fs');

let user = {
    имя: 'Джон Доу',
    emai: '[email protected]',
    возраст: 27,
    мужской пол',
    профессия: «Разработчик программного обеспечения»
};


const data = JSON.stringify (пользователь);


fs.writeFile ('./ user.json', data, 'utf8', (err) => {

    if (err) {
        console.log (`Ошибка записи файла: $ {err}`);
    } еще {
        console.log (`Файл успешно записан!`);
    }

});
  

В приведенном выше примере мы сохраняем объект JSON user в файл user.json .

Обратите внимание на использование метода JSON.stringify () для преобразования объекта JSON в строку JSON перед сохранением его на диск. Если вы попытаетесь записать объект в файл без предварительного преобразования его в строку, ваш файл будет пустым и будет выглядеть, как показано ниже:

  [объект, объект]
  

Теперь, если вы выполните приведенный выше код, вы должны увидеть следующее содержимое в user.json файл:

  {"имя": "Джон Доу", "emai": "[email protected]", "возраст": 27, "пол": "Мужской", "профессия": "Разработчик программного обеспечения"}
  

Технически это все, что вам нужно для записи JSON в файл. Однако данные записываются в файл как одна строка.

Чтобы красиво распечатать объект JSON, измените метод JSON.stringify () следующим образом:

 
const data = JSON.stringify (пользователь, null, 4);
  

Теперь, если открыть user.json , вы должны увидеть следующее содержимое:

  {
    "name": "Джон Доу",
    "emai": "[email protected]",
    «возраст»: 27,
    "мужской пол",
    «профессия»: «Разработчик программного обеспечения»
}
  

Запись в файл JSON с использованием

fs.writeFileSync ()

Наконец, последний способ записи данных в файл JSON — использование метода fs.writeFileSync () . Он синхронно записывает данные в файл, что означает, что он блокирует выполнение Node.js, пока файл не будет записан на диск.

Взгляните на следующий пример, в котором fs.writeFileSync () используется для записи объекта JSON в файл:

  const fs = require ('fs');

let user = {
    имя: 'Джон Доу',
    emai: '[email protected]',
    возраст: 27,
    мужской пол',
    профессия: «Разработчик программного обеспечения»
};

пытаться {

    
    const data = JSON.stringify (пользователь, null, 4);

    
    fs.writeFileSync ('./ user.json', data, 'utf8');

    console.log (`Файл успешно записан!`);

} catch (err) {
    приставка.log (`Ошибка записи файла: $ {err}`);
}
  

Обновление файла JSON

Теперь, когда мы узнали, как читать и записывать файлы JSON, что, если вы хотите обновить существующий файл JSON?

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

Вот пример, демонстрирующий, как можно добавить еще одну запись в базы данных .json файл:

  const fs = require ('fs');


fs.readFile ('./ databases.json', 'utf8', (err, data) => {

    if (err) {
        console.log (`Ошибка чтения файла с диска: $ {err}`);
    } еще {

        
        const базы данных = JSON.parse (данные);

        
        database.push ({
            имя: 'Postgres',
            тип: 'СУБД'
        });

        
        fs.writeFile ('./ databases.json', JSON.stringify (databases, null, 4), (err) => {
            if (err) {
                приставка.log (`Ошибка записи файла: $ {err}`);
            }
        });
    }

});
  

Теперь, если вы выполните приведенный выше код, вы должны увидеть новую запись в databases.json , как показано ниже:

  [
    {
        "name": "MySQL",
        "тип": "СУБД"
    },
    {
        "name": "MongoDB",
        "тип": "NoSQL"
    },
    {
        "name": "Neo4j",
        "тип": "БД графика"
    },
    {
        "name": "Postgres",
        "тип": "СУБД"
    }
]
  

Сторонние библиотеки

Если вы не хотите вручную анализировать или преобразовывать данные JSON каждый раз при чтении или записи в файл JSON, используйте вместо этого модуль jsonfile.

Модуль jsonfile включает в себя методы объекта fs и JSON и предоставляет те же методы, что и модуль fs , для чтения и записи файлов JSON.

Введите следующую команду в корневом каталоге проекта, чтобы установить модуль jsonfile :

  $ npm установить jsonfile --save
  

Для чтения данных из файлов JSON модуль jsonfile предоставляет методы readFile () и readFileSync () .Они аналогичны тем, которые предлагаются модулем fs , за исключением того, что они автоматически анализируют содержимое файла в объект JSON:

  const jsonfile = require ('jsonfile');

jsonfile.readFile ('./ databases.json', (err, databases) => {

    if (err) {
        console.log (`Ошибка чтения файла с диска: $ {err}`);
    } еще {

        database.forEach (db => {
            console.log (`$ {db.name}: $ {db.type}`);
        });
    }

});
  

Аналогично, чтобы записать данные в файл JSON, вы можете использовать метод writeFile () или writeFileSync () :

  const jsonfile = require ('jsonfile');

let user = {
    имя: 'Джон Доу',
    emai: Джон[email protected] ',
    возраст: 27,
    мужской пол',
    профессия: «Разработчик программного обеспечения»
};

jsonfile.writeFile ('./ user.json', user, {пробелы: 4}, (err) => {

    if (err) {
        console.log (`Ошибка записи файла: $ {err}`);
    } еще {
        console.log (`Файл успешно записан!`);
    }

});
  

Заключение

JSON — один из самых популярных типов данных, которые, как вы ожидаете, будут работать в Node.js, и возможность чтения и записи файлов JSON чрезвычайно полезна.

В этой статье мы рассмотрели различные способы чтения и записи файлов JSON, включая модуль fs , метод require () и модуль jsonfile — сторонний модуль.

Модуль fs — это собственный модуль, который предоставляет функции как для чтения, так и для записи файлов. Методы fs.readFile () и fs.writeFile () могут использоваться для асинхронного чтения и записи данных в файлы JSON. Для синхронного взаимодействия с файловой системой доступны методов fs.readFileSync () и fs.writeFileSync () .

Вы также можете использовать глобальный метод require () для синхронного чтения и анализа файла JSON при запуске.Однако он кэширует только данные файла и может использоваться только для чтения файлов с расширением .json .

Если вы хотите узнать больше, посмотрите, что такое JSON на самом деле, и как вы можете читать и записывать объект JSON в файл в Node.js.

✌️ Понравилась статья? Следуй за мной на
Твиттер
и LinkedIn.
Вы также можете подписаться на
Новостная лента.

Модульное тестирование Node.js fs с использованием mock-fs · Эмма Гото

Если вы используете модуль fs для таких вещей, как запись в файлы или изменение имен файлов, вы, возможно, задались вопросом — как это выполнить модульное тестирование?

В этом посте я покажу вам, как можно использовать mock-fs для простого модульного тестирования вашего Node.js скрипты.

Если вы хотите узнать больше о Node.js, ознакомьтесь с моими сообщениями об автоматизации переименования файлов с помощью Node.js и записи в файлы с помощью Node.js.

Настройте ваш скрипт Node.js для тестирования

Для начала мы будем использовать пример скрипта Node.js, который использует fs для замены строки «Hello» на «Goodbye».

Этот пример является полностью синхронным и использует только fs readFileSync и writeFileSync :

  const {readFileSync, writeFileSync} = require ('fs');

const modifyFile = () => {
    const file = `$ {process.cwd ()} / имя_папки / index.md`

    const content = readFileSync (файл, 'utf8'); const newContent = content.replace («Привет», «До свидания»);

    writeFileSync (файл, newContent);};  

Если ваш сценарий полностью синхронизирован, у вас не будет проблем, и вы можете продолжать прокрутку до части mock-fs ниже.

Однако, если вы используете асинхронные функции, такие как fs readFile или writeFile , вам необходимо убедиться, что ваш скрипт завершил до того, как начнет модульные тесты.

Мы можем сделать это с помощью fs Promises API.

Использование fs Promises API

Вместо использования readFile используйте promises.readFile , и вы вернете обещание:

  const {promises} = require ('fs');

const modifyFile = async () => {
    const file = `$ {process.cwd ()} / имя_папки / index.md`

    return promises.readFile (file, 'utf8'). then (content => {const newContent = content.replace ('Привет', 'До свидания')
        верните обещания.writeFile (файл, newContent); });
};  

Это означает, что теперь в модульном тесте вы можете использовать await и убедиться, что ваш скрипт завершен перед его тестированием:

  test ('следует заменить Hello на Goodbye', async () => {
    ждать modifyFile ();
      

Однако, прежде чем делать какие-либо утверждения, нам также нужно добавить несколько имитаторов.

Макет ваших файлов и папок с помощью mock-fs

Мы хотим иметь возможность имитировать некоторые файлы, потому что в противном случае вам понадобятся фиктивные тестовые файлы, которые находятся в вашей тестовой папке, и вам также потребуется сбросить их в исходное состояние в конце каждого модульного теста.

С помощью mock-fs мы можем имитировать структуру папок и содержимое файлов.

Сначала убедитесь, что он установлен:

  npm i mock-fs -D

yarn add mock-fs -D  

Затем добавьте его к крючку beforeAll в вашем тесте:

  import mock from 'mock-fs';
import {main} из './modifyFile';

describe ('modifyFile script', () => {
    beforeAll (() => {
        насмехаться({
            'имя папки': {
                'index.md': '# Привет, мир!',
            },
        });
    });

    afterAll (() => {
        насмехаться.восстановить();
    });  

Эти имена папок относятся к корню вашего репозитория. Здесь мы имитируем структуру папок / файлов следующим образом:

Напишите модульный тест на модификацию файла с помощью mock-fs

Теперь мы можем продолжить наш модульный тест. Мы можем утверждать по содержимому файла:

  test ('следует заменить привет на прощание', async () => {
    const file = `$ {process.cwd ()} / имя_папки / index.md`
    const expectedResult = `# Прощай, мир`;

    ждать modifyFile ();

    const result = readFileSync (файл, 'utf8');
    ожидать (результат).toEqual (ожидаемый результат);
});  

Когда мы вызываем modifyFile , мы будем изменять фиктивный файл. Затем мы можем подтвердить, что файл был успешно изменен, используя readFileSync для его чтения.

Напишите модульный тест переименования файлов с помощью mock-fs

В случае, если мы хотим провести модульный тест переименования файлов, мы можем сделать следующее:

  import glob from 'glob';

test ('следует успешно перемещать и переименовывать файлы', async () => {
    const expectedFiles = [
        `$ {process.cwd ()} / folderName / renamedFile.md`,
    ];

    ждать modifyFile ();

    const files = glob.sync (`$ {process.cwd ()} / имя_папки / *. md`);

    ожидать (файлы) .toEqual (ожидаемые файлы);
});  

Поскольку мы использовали mock-fs, ваш скрипт также может переименовывать имитированные файлы. Затем мы можем использовать glob , чтобы убедиться, что наши файлы были переименованы должным образом.

фс | Модули JavaScript | Приложение | Руководство

const fs = требуется ('fs')

Реализация пытается следовать CommonJS
Файловая система / A / 0
спецификация, где это возможно.

Рабочий каталог

Приведенные ниже функции каталога не должны использовать текущий рабочий каталог сервера, например . или . / Тест .
Вы не сможете определить, разрешает ли среда, в которой работает сервер, список каталогов,
чтение или запись файлов.

Вы должны либо основывать свои каталоги с помощью getTempPath () , либо в качестве службы Foxx использовать
module.context.basePath.

Манипуляции с каталогом с одним файлом

существует

проверяет, существует ли файл любого типа или каталога
фс.существует (путь)

Возвращает истину, если файл (любого типа) или каталог существует в заданном
дорожка. Если файл является неработающей символической ссылкой, возвращает false.

isFile

проверяет, является ли путь файлом
fs.isFile (путь)

Возвращает истину, если путь указывает на файл.

— это каталог

проверяет, является ли путь каталогом
fs.isDirectory (путь)

Возвращает истину, если путь указывает на каталог.

размер

получает размер файла
fs.size (путь)

Возвращает размер файла, указанного в пути .

mtime

получает время последней модификации файла
fs.mtime (имя файла)

Возвращает дату последнего изменения указанного файла. Дата
возвращается как отметка времени Unix (количество секунд, прошедших с 1 января 1970 г.).

разделитель пути

fs.path Разделитель

Если вы хотите объединить два пути, вы можете использовать fs.pathSeparator вместо / или \ .

присоединиться

fs.join (путь, имя файла)

Функция возвращает комбинацию пути и имени файла, например
fs.join ('folder', 'file.ext') вернет folder / file.ext .

getTempFile

возвращает имя (нового) временного файла
fs.getTempFile (каталог, createFile)

Возвращает имя нового временного файла в каталоге в каталоге .Если createFile равно true , будет создан пустой файл, поэтому никакие другие
процесс может создать файл с таким же именем.

Примечание : каталог каталог должен существовать.

getTempPath

возвращает временный каталог
fs.getTempPath ()

Возвращает абсолютный путь к временному каталогу

маркаAbsolute

делает заданный путь абсолютным
fs.makeAbsolute (путь)

Возвращает заданную строку, если это абсолютный путь, в противном случае
возвращается абсолютный путь к тому же местоположению.

chmod

устанавливает права доступа к файлам для указанных файлов (не только для Windows).
fs.chmod (путь, режим)

, где mode — это строка с начальным нулем, соответствующая OCTAL-MODE , как объяснено
в * nix человек chmod .

Возвращает истину в случае успеха.

список

возвращает список каталогов
fs.list (путь)

Функция возвращает имена всех файлов в каталоге в
лексически отсортированный порядок.Выдает исключение, если каталог не может быть
пройден (или путь не является каталогом).

Примечание : это означает, что список («x») каталога, содержащий «a» и «b», будет
return [«a», «b»], а не [«x / a», «x / b»].

listTree

возвращает дерево каталогов
fs.listTree (путь)

Функция возвращает массив, который начинается с заданного пути, и все
пути относительно данного пути, обнаруженные обходом в глубину
каждого каталога в любом посещенном каталоге, сообщая, но не просматривая
символические ссылки на каталоги.Первый путь всегда "" , путь
относительно себя.

makeDirectory

создает каталог
fs.makeDirectory (путь)

Создает каталог, указанный в , путь .

makeDirectoryRecursive

создает каталог
fs.makeDirectoryRecursive (путь)

Создает иерархию каталогов, указанную путем .

удалить

удаляет файл
фс.удалить (имя файла)

Удаляет файл имя файла по заданному пути. Выдает исключение, если
path соответствует всему, что не является файлом или символической ссылкой. Если
«Путь» относится к символической ссылке, удаляет символическую ссылку.

removeDirectory

удаляет пустой каталог
fs.removeDirectory (путь)

Удаляет каталог, если он пуст. Выдает исключение, если путь не
пустой каталог.

removeDirectoryRecursive

удаляет каталог
фс.removeDirectoryRecursive (путь)

Удаляет каталог со всеми подэлементами. Выдает исключение, если путь
это не каталог.

Файл IO

читать

читает в файл
fs.read (имя файла)

Считывает файл и возвращает содержимое в виде строки. Обратите внимание, что
содержимое файла должно быть в кодировке UTF-8.

читать64

читает файл как base64
fs.read64 (имя файла)

Считывает файл и возвращает содержимое в виде строки.Содержимое файла
В кодировке Base64.

читать Буфер

читает в файл
fs.readBuffer (имя файла)

Считывает файл и возвращает его содержимое в объекте Buffer.

читатьFileSync

fs.readFileSync (имя файла, кодировка)

Считывает содержимое файла, указанного в , имя файла . Если указано кодировка ,
содержимое файла будет возвращено в виде строки. Поддерживаемые кодировки:

  • utf8 или utf-8
  • ascii
  • base64
  • ucs2 или ucs-2
  • utf16le или utf16be
  • шестигранник

Если кодировка не указана, содержимое файла будет возвращено в буфере.
объект.

написать

fs.write (имя файла, содержимое)

Записывает содержимое в файл. Контент может быть строкой или буфером
объект. Если файл уже существует, он обрезается.

writeFileSync

fs.writeFileSync (имя файла, содержимое)

Это псевдоним для fs.write (имя файла, содержимое) .

добавить

fs.append (имя файла, содержание)

Записывает содержимое в файл.Контент может быть строкой или буфером
объект. Если файл уже существует, содержимое добавляется в
конец.

Рекурсивные манипуляции

copyRecursive

копирует структуру каталогов
fs.copyRecursive (источник, место назначения)

Копирует исходный в пункт назначения .
Будут выброшены исключения:

  • Ошибка копирования файла
  • указание каталога для назначения, когда источником является файл
  • с указанием каталога в качестве источника и назначения

Копировать файл

копирует файл в целевой файл
фс.copyFile (источник, место назначения)

Копирует из источника в место назначения. Если место назначения — это каталог, файл
с таким же именем будет создана в этом каталоге, иначе копия получит
в
указанное имя файла.

ссылка Файл

создает символическую ссылку из цели вместо пути ссылки.
fs.linkFile (цель, путь ссылки)

В пути linkpath будет создана символическая ссылка на target .

переместить

переименовывает файл
фс.перемещение (источник, место назначения)

Перемещает источник к месту назначения. Невозможность переместить файл или
указание каталога для назначения, когда источником является файл, вызовет
исключение. Аналогичным образом, указание каталога в качестве источника и назначения приведет к
неудача.

ZIP

распаковать файл

распаковывает файл
fs.unzipFile (имя файла, исходящий путь, skipPaths, перезапись, пароль)

Распаковывает zip-файл, указанный в имя_файла , в путь, указанный в
выезд .Перезаписывает любые существующие целевые файлы, если установлено значение overwrite
к правда .

Возвращает true , если файл был успешно разархивирован.

zip Файл

архивирует файл
fs.zipFile (имя файла, chdir, файлы, пароль)

Сохраняет файлы, указанные в файлах , в zip-файле имя файла . Если
файл имя файла уже существует, возникает ошибка. Список ввода
файлы файлы должны быть указаны в виде списка абсолютных имен файлов.Если chdir — это
не пусто, префикс chdir будет удален из имени файла в
zip, поэтому в распакованном виде имена файлов будут относительными.
Указывать пароль необязательно.

Возвращает true , если файл был успешно заархивирован.

Прочитать файл json в Node.js


Чтобы прочитать любой файл в Node.js, вам необходимо импортировать fs или модуль файловой системы.Оттуда у вас есть два метода на выбор: readFile и readFileSync .

Оба аналогичны тем, что возвращают буфер двоичных данных из файла. readFile принимает обратный вызов, который получит буфер, а readFileSync возвращает его синхронно.

В действии они выглядят так:

  const fs = require ('fs') 

fs.readFile ('./ data.json', (error, data) => (
error? Console.error (error): console.log (данные)
))

попробуйте {
console.log (fs.readFileSync ('./ data.json'))
} catch (error) {
console.error (error)
}

Если вы запустите этот код в каталоге с файлом data.json , оба метода будут регистрировать что-то вроде:

  <Буфер 7b 0a 20 20 22 64 61 74 61 22 3a 20 74 72 75 65 0a 7d>
  

Оба возвращают одни и те же данные, но они не расходуются. В большинстве случаев вам потребуется выполнить еще одну операцию, чтобы использовать данные, которые вы прочитали из файла.

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

  const fs = require ('fs') 

fs.readFile ('./ data.json', (error, data) => (
error? Console.error (error): console.log (JSON. parse (data))
))

попробуйте {
console.log (JSON.parse (fs.readFileSync ('./ data.json')))
} catch (error) {
console.ошибка (ошибка)
}

Запустите его еще раз, и вы увидите, что все данные, которые вы сохранили в своем json-файле, занесены в консоль. Вы успешно прочитали json-файл в Node.js!

Здесь вы можете увидеть код в действии:

Удачного кодирования!

Неемия 8: 3
(ЦУР)

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *