Содержание

Руководство по Node.js, часть 9: работа с файловой системой

Сегодня, в девятой части перевода руководства по Node.js, мы поговорим о работе с файлами. В частности, речь пойдёт о модулях fs и path — о файловых дескрипторах, о путях к файлам, о получении информации о файлах, об их чтении и записи, о работе с директориями.

[Советуем почитать] Другие части цикла

Часть 1: Общие сведения и начало работы
Часть 2: JavaScript, V8, некоторые приёмы разработки
Часть 3: Хостинг, REPL, работа с консолью, модули
Часть 4: npm, файлы package.json и package-lock.json
Часть 5: npm и npx
Часть 6: цикл событий, стек вызовов, таймеры
Часть 7: асинхронное программирование
Часть 8: Руководство по Node.js, часть 8: протоколы HTTP и WebSocket
Часть 9: Руководство по Node.js, часть 9: работа с файловой системой

Работа с файловыми дескрипторами в Node.js

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

Дескриптор можно получить, воспользовавшись для открытия файла асинхронным методом open() из модуля fs:

const fs = require('fs')
fs.open('/Users/flavio/test.txt', 'r', (err, fd) => {
  //fd - это дескриптор файла
})

Обратите внимание на второй параметр, r, использованный при вызове метода fs.open(). Это — флаг, который сообщает системе о том, что файл открывают для чтения. Вот ещё некоторые флаги, которые часто используются при работе с этим и некоторыми другими методами:

  • r+ — открыть файл для чтения и для записи.
  • w+ — открыть файл для чтения и для записи, установив указатель потока в начало файла. Если файл не существует — он создаётся.
  • a — открыть файл для записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.
  • a+ — открыть файл для чтения и записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.

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

const fs = require('fs')
try {
  const fd = fs.openSync('/Users/flavio/test.txt', 'r')
} catch (err) {
  console.error(err)
}

После получения дескриптора любым из вышеописанных способов вы можете производить с ним необходимые операции.

Данные о файлах

С каждым файлом связан набор данных о нём, исследовать эти данные можно средствами Node.js. В частности, сделать это можно, используя метод stat() из модуля fs.

Вызывают этот метод, передавая ему путь к файлу, и, после того, как Node.js получит необходимые сведения о файле, он вызовет коллбэк, переданный методу stat(). Вот как это выглядит:

const fs = require('fs')
fs.stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console. error(err)
    return
  }
  //сведения о файле содержатся в аргументе `stats`
})

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

const fs = require('fs')
try {
  const stats = fs.statSync ('/Users/flavio/test.txt')
} catch (err) {
  console.error(err)
}

Информация о файле попадёт в константу stats. Что это за информация? На самом деле, соответствующий объект предоставляет нам большое количество полезных свойств и методов:

  • Методы .isFile() и .isDirectory() позволяют, соответственно, узнать, является ли исследуемый файл обычным файлом или директорией.
  • Метод .isSymbolicLink() позволяет узнать, является ли файл символической ссылкой.
  • Размер файла можно узнать, воспользовавшись свойством .size.

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

const fs = require('fs')
fs. stat('/Users/flavio/test.txt', (err, stats) => {
  if (err) {
    console.error(err)
    return
  }
  stats.isFile() //true
  stats.isDirectory() //false
  stats.isSymbolicLink() //false
  stats.size //1024000 //= 1MB
})

Пути к файлам в Node.js и модуль path

Путь к файлу — это адрес того места в файловой системе, где он расположен.

В Linux и macOS путь может выглядеть так:

/users/flavio/file.txt

В Windows пути выглядят немного иначе:

C:usersflaviofile.txt

На различия в форматах записи путей при использовании разных операционных систем следует обращать внимание, учитывая операционную систему, используемую для развёртывания Node.js-сервера.

В Node.js есть стандартный модуль path, предназначенный для работы с путями к файлам. Перед использованием этого модуля в программе его надо подключить:

const path = require('path')

▍Получение информации о пути к файлу

Если у вас есть путь к файлу, то, используя возможности модуля path, вы можете, в удобном для восприятия и дальнейшей обработки виде, узнать подробности об этом пути.

Выглядит это так:

const notes = '/users/flavio/notes.txt'
path.dirname(notes) // /users/flavio
path.basename(notes) // notes.txt
path.extname(notes) // .txt

Здесь, в строке notes, хранится путь к файлу. Для разбора пути использованы следующие методы модуля path:

  • dirname() — возвращает родительскую директорию файла.
  • basename() — возвращает имя файла.
  • extname() — возвращает расширение файла.

Узнать имя файла без расширения можно, вызвав метод .basename()

и передав ему второй аргумент, представляющий расширение:

path.basename(notes, path.extname(notes)) //notes

▍Работа с путями к файлам

Несколько частей пути можно объединить, используя метод path.join():

const name = 'flavio'
path.join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'

Найти абсолютный путь к файлу на основе относительного пути к нему можно с использованием метода path. resolve():

path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки

В данном случае Node.js просто добавляет

/flavio.txt к пути, ведущем к текущей рабочей директории. Если при вызове этого метода передать ещё один параметр, представляющий путь к папке, метод использует его в качестве базы для определения абсолютного пути:

path.resolve('tmp', 'flavio.txt')
// '/Users/flavio/tmp/flavio.txt' при запуске из моей домашней папки

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

path.resolve('/etc', 'flavio.txt')
// '/etc/flavio.txt'

Вот ещё один полезный метод — path.normalize(). Он позволяет найти реальный путь к файлу, используя путь, в котором содержатся спецификаторы относительного пути вроде точки (

.), двух точек (..), или двух косых черт:

path.normalize('/users/flavio/. .//test.txt') 
// /users/test.txt

Методы resolve() и normalize() не проверяют существование директории. Они просто находят путь, основываясь на переданным им данным.

Чтение файлов в Node.js

Самый простой способ чтения файлов в Node.js заключается в использовании метода fs.readFile() с передачей ему пути к файлу и коллбэка, который будет вызван с передачей ему данных файла (или объекта ошибки):

fs.readFile('/Users/flavio/test.txt', (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(data)
})

Если надо, можно воспользоваться синхронной версией этого метода — fs.readFileSync():

const fs = require('fs')
try {
  const data = fs.readFileSync('/Users/flavio/test.txt')
  console.log(data)
} catch (err) {
  console.error(err)
}

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

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

Запись файлов в Node.js

В Node.js легче всего записывать файлы с использованием метода fs.writeFile():

const fs = require('fs')
const content = 'Some content!'
fs.writeFile('/Users/flavio/test.txt', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //файл записан успешно
})

Есть и синхронная версия того же метода —

fs.writeFileSync():

const fs = require('fs')
const content = 'Some content!'
try {
  const data = fs.writeFileSync('/Users/flavio/test.txt', content)
  //файл записан успешно
} catch (err) {
  console.error(err)
}

Эти методы, по умолчанию, заменяют содержимое существующих файлов. Изменить их стандартное поведение можно, воспользовавшись соответствующим флагом:

fs.writeFile('/Users/flavio/test.txt', content, { flag: 'a+' }, (err) => {})

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

Присоединение данных к файлу

Метод fs.appendFile() (и его синхронную версию — fs.appendFileSync()) удобно использовать для присоединения данных к концу файла:

const content = 'Some content!'
fs.appendFile('file.log', content, (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово!
})

Об использовании потоков

Выше мы описывали методы, которые, выполняя запись в файл, пишут в него весь объём переданных им данных, после чего, если используются их синхронные версии, возвращают управление программе, а если применяются асинхронные версии — вызывают коллбэки. Если вас такое состояние дел не устраивает — лучше будет воспользоваться потоками.

Работа с директориями в Node.js

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

▍Проверка существования папки

Для того чтобы проверить, существует ли директория и может ли Node.js получить к ней доступ, учитывая разрешения, можно использовать метод fs.access().

▍Создание новой папки

Для того чтобы создавать новые папки, можно воспользоваться методами fs.mkdir() и fs.mkdirSync():

const fs = require('fs')
const folderName = '/Users/flavio/test'
try {
  if (!fs.existsSync(dir)){
    fs.mkdirSync(dir)
  }
} catch (err) {
  console.error(err)
}

▍Чтение содержимого папки

Для того чтобы прочесть содержимое папки, можно воспользоваться методами fs.readdir() и fs.readdirSync(). В этом примере осуществляется чтение содержимого папки — то есть — сведений о том, какие файлы и поддиректории в ней имеются, и возврат их относительных путей:

const fs = require('fs')
const path = require('path')
const folderPath = '/Users/flavio'
fs. readdirSync(folderPath)

Вот так можно получить полный путь к файлу:

fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)
}

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

const isFile = fileName => {
  return fs.lstatSync(fileName).isFile()
}
fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)).filter(isFile)
}

▍Переименование папки

Для переименования папки можно воспользоваться методами fs.rename() и fs.renameSync(). Первый параметр — это текущий путь к папке, второй — новый:

const fs = require('fs')
fs.rename('/Users/flavio', '/Users/roger', (err) => {
  if (err) {
    console.error(err)
    return
  }
  //готово
})

Переименовать папку можно и с помощью синхронного метода fs.renameSync():

const fs = require('fs')
try {
  fs.renameSync('/Users/flavio', '/Users/roger')
} catch (err) {
  console. error(err)
}

▍Удаление папки

Для того чтобы удалить папку, можно воспользоваться методами fs.rmdir() или fs.rmdirSync(). Надо отметить, что удаление папки, в которой что-то есть, задача несколько более сложная, чем удаление пустой папки. Если вам нужно удалять такие папки, воспользуйтесь пакетом fs-extra, который весьма популярен и хорошо поддерживается. Он представляет собой замену модуля fs, расширяющую его возможности.

Метод remove() из пакета fs-extra умеет удалять папки, в которых уже что-то есть.

Установить этот модуль можно так:

npm install fs-extra

Вот пример его использования:

const fs = require('fs-extra')
const folder = '/Users/flavio'
fs.remove(folder, err => {
  console.error(err)
})

Его методами можно пользоваться в виде промисов:

fs.remove(folder).then(() => {
  //готово
}).catch(err => {
  console.error(err)
})

Допустимо и применение конструкции async/await:

async function removeFolder(folder) {
  try {
    await fs. remove(folder)
    //готово
  } catch (err) {
    console.error(err)
  }
}
const folder = '/Users/flavio'
removeFolder(folder)

Модуль fs

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

const fs = require('fs')

После этого у вас будет доступ к его методам, среди которых отметим следующие, некоторые из которых вам уже знакомы:

  • fs.access(): проверяет существование файла и возможность доступа к нему с учётом разрешений.
  • fs.appendFile(): присоединяет данные к файлу. Если файл не существует — он будет создан.
  • fs.chmod(): изменяет разрешения для заданного файла. Похожие методы: fs.lchmod(), fs.fchmod().
  • fs.chown(): изменяет владельца и группу для заданного файла. Похожие методы: fs.fchown(), fs.lchown().
  • fs.close(): закрывает дескриптор файла.
  • fs.copyFile(): копирует файл.
  • fs.createReadStream(): создаёт поток чтения файла.
  • fs.createWriteStream(): создаёт поток записи файла.
  • fs.link(): создаёт новую жёсткую ссылку на файл.
  • fs.mkdir(): создаёт новую директорию.
  • fs.mkdtemp(): создаёт временную директорию.
  • fs.open(): открывает файл.
  • fs.readdir(): читает содержимое директории.
  • fs.readFile(): считывает содержимое файла. Похожий метод: fs.read().
  • fs.readlink(): считывает значение символической ссылки.
  • fs.realpath(): разрешает относительный путь к файлу, построенный с использованием символов . и .., в полный путь.
  • fs. rename(): переименовывает файл или папку.
  • fs.rmdir(): удаляет папку.
  • fs.stat(): возвращает сведения о файле. Похожие методы: fs.fstat(), fs.lstat().
  • fs.symlink(): создаёт новую символическую ссылку на файл.
  • fs.truncate(): обрезает файл до заданной длины. Похожий метод: fs.ftruncate().
  • fs.unlink(): удаляет файл или символическую ссылку.
  • fs.unwatchFile(): отключает наблюдение за изменениями файла.
  • fs.utimes(): изменяет временную отметку файла. Похожий метод: fs.futimes().
  • fs.watchFile(): включает наблюдение за изменениями файла. Похожий метод: fs.watch().
  • fs.writeFile(): записывает данные в файл. Похожий метод: fs.write().

Интересной особенностью модуля fs является тот факт, что все его методы, по умолчанию, являются асинхронными, но существуют и их синхронные версии, имена которых получаются путём добавления слова Sync к именам асинхронных методов.

Например:

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

Использование синхронных методов серьёзно влияет на то, как работает программа.

В Node.js 10 имеется экспериментальная поддержка этих API, основанных на промисах.

Исследуем метод fs.rename(). Вот асинхронная версия этого метода, использующая коллбэки:

const fs = require('fs')
fs.rename('before.json', 'after.json', (err) => {
  if (err) {
    return console.error(err)
  }
  //готово
})

При использовании его синхронной версии для обработки ошибок используется конструкция try/catch:

const fs = require('fs')
try {
  fs.renameSync('before.json', 'after.json')
  //готово
} catch (err) {
  console.error(err)
}

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

Модуль path

Модуль path, о некоторых возможностях которого мы тоже уже говорили, содержит множество полезных инструментов, позволяющих взаимодействовать с файловой системой. Как уже было сказано, устанавливать его не нужно, так как он является частью Node.js. Для того чтобы пользоваться им, его достаточно подключить:

const path = require('path')

Свойство path.sep этого модуля предоставляет символ, использующийся для разделения сегментов пути ( в Windows и / в Linux и macOS), а свойство path.delimiter даёт символ, используемый для отделения друг от друга нескольких путей (; в Windows и : в Linux и macOS).

Рассмотрим и проиллюстрируем примерами некоторые методы модуля path.

▍path.basename()

Возвращает последний фрагмент пути. Передав второй параметр этому методу можно убрать расширение файла.

require('path').basename('/test/something') //something
require('path'). basename('/test/something.txt') //something.txt
require('path').basename('/test/something.txt', '.txt') //something

▍path.dirname()

Возвращает ту часть пути, которая представляет имя директории:

require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something
<h4><font color="#000">▍path.extname()</font></h4>
</code>Возвращает ту часть пути, которая представляет расширение файла:
<source>require('path').dirname('/test/something') // ''
require('path').dirname('/test/something/file.txt') // '.txt'

▍path.isAbsolute()

Возвращает истинное значение если путь является абсолютным:

require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false

▍path.join()

Соединяет несколько частей пути:

const name = 'flavio'
require('path').join('/', 'users', name, 'notes.txt') //'/users/flavio/notes. txt'

▍path.normalize()

Пытается выяснить реальный путь на основе пути, который содержит символы, использующиеся при построении относительных путей вроде ., .. и //:

require('path').normalize('/users/flavio/..//test.txt') ///users/test.txt

▍path.parse()

Преобразует путь в объект, свойства которого представляют отдельные части пути:

  • root: корневая директория.
  • dir: путь к файлу, начиная от корневой директории
  • base: имя файла и расширение.
  • name: имя файла.
  • ext: расширение файла.

Вот пример использования этого метода:

require('path').parse('/users/test.txt')

В результате его работы получается такой объект:

{
  root: '/',
  dir: '/users',
  base: 'test.txt',
  ext: '.txt',
  name: 'test'
}

▍path.relative()

Принимает, в качестве аргументов, 2 пути. Возвращает относительный путь из первого пути ко второму, основываясь на текущей рабочей директории:

require('path'). relative('/Users/flavio', '/Users/flavio/test.txt') //'test.txt'
require('path').relative('/Users/flavio', '/Users/flavio/something/test.txt') //'something/test.txt'

▍path.resolve()

Находит абсолютный путь на основе переданного ему относительного пути:

path.resolve('flavio.txt') 
//'/Users/flavio/flavio.txt' при запуске из моей домашней папки.

Итоги

Сегодня мы рассмотрели модули Node.js fs и path, которые используются для работы с файловой системой. В следующей части этой серии, на которой она завершается, мы обсудим модули os, events, http, поговорим о работе с потоками и с системами управления базами данных в Node.js.

Уважаемые читатели! Какими npm-пакетами вы пользуетесь при работе с файловой системой в Node.js?

Автор: ru_vds

Источник

Марквиз – помогаем посетителю оставить заявку

Пользуюсь марквизом более 2 лет в разных направлениях. Тестировал моклиентс и енвибокс. Но на этапе тестирования примуществом овладел марквиз. Удобное расположение кнопок, класный редактор, интуитивно понятный интерфейс. Море удобных функций, до которых схожим сервисам еще расти и расти! А главное, это супер тех. поддержка!!! Отвечают в течении минуты, решают любой вопрос очень быстро и как никто лояльны. Всем рекомендую!!!

Данил Абакумо

Пользователь otzyvmarketing

До Marquiz использовал другой онлайн-конструктор, в сравнении с которым Marquiz набирает 100 баллов из 100! Нравится тут расположение кнопок, простой интерфейс, широкие возможности кастомизации, отзывчивость техподдержки. И самое главное, что работает все четко и без сбоев! С задачей своей сервис справляется на ура — позволяет найти потенциального клиента и превратить его в покупателя!

Антон Коршунов

Пользователь CRMindex

Прошло только три месяца, как мы стали использовать Marquiz, а результаты уже впечатляют! За это время продажи с сайта удалось поднять на 20% и на этом останавливаться не собираемся! Создавать квизы в онлайн-конструкторе одно удовольствие! Весь процесс занимает максимум минут 15 (если не уделять особого внимания оформлению). У Marquiz много полезных функций, при этом сложностей с освоением интерфейса не возникло совершенно. Всего пару раз обращались за помощью в саппорт на этапах знакомства с функционалом. Благодаря информативной статистике по ответам делаем расширенный анализ. На основе полученных ответов не раз разрабатывали интересные предложения и корректировали свои действия по маркетингу в целом. В ближайшее время планируем перейти на более расширенный пакет, чтобы и дальше увеличивать потенциал. Для увеличения числа заявок сервис Marquiz отлично подходит! Рекомендуем смело!

Ростислав

Пользователь CRMindex

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

Alexander Brtn

Пользователь StartPack

На момент написания обзора — самый функциональный сервис для конструирования квиза. Сама идея виджета свежая и вызывает интерес у клиентов. Рекомендуем попробовать в сравнении с другими стандартными лидогенераторами (формы обратного звонка, онлайн-чаты и т.д.)

Арсений Груздев

интернет-маркетолог

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

Елена Cтепанова

Пользователь In-Scale

Впервые столкнулась с такой темой. Раньше пользовались самыми обычными формами захвата лида на сайте. И вроде бы даже все нравилось, а тут решили попробовать что-то интересное. Оказалось, что квизы — супер идея! Не заезженное «Купи сейчас скидка 20% истекает сегодня…», а интеллектуальный и реально вовлекающий этап продаж! Мало того, что человек тебе рассказывает о своих потребностях, он сам же тебе и свои контакты для предложения оставляет.

Лилия Сабулина

Пользователь In-Scale

Пользуюсь марквизом уже год, до этого о функции квизов даже не слышал и решил попробовать) Подключил квиз к сайту, написал вопросы, вставил картинки и количество заказов с сайта выросло процентов на 35-40, что было приятным сюрпризом) Плюс первые заказы я получил на бесплатном тарифе) Наверное такой эффект из-за незаезженности функции) Настройка максимально простая, если не заморачиваться по дизайну можно все настроить минут за 10)

Ярослов Сувинов

Пользователь In-Scale

Показать много отзывов

Файл записи Nodejs упрощен с помощью 4 простых примеров

Содержание

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

 const fs = требуется ('fs')
fs.writeFile(<имя файла>, <содержимое>, <функция обратного вызова>) 

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

Реклама

Помимо знания структуры модуля fs , вам необходимо удобно записывать файлы Nodejs, заканчивающиеся на .txt , .html , .js и 0.json extensions. Это требует понимания того, как работает модуль, и знания альтернативных способов записи файла в Nodejs.

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

ТАКЖЕ ЧИТАЙТЕ: как перебрать массив в Node.js [6 методов]

Начнем с ключевых понятий.

 

Концепции записи файлов Nodejs

Синхронная и асинхронная запись файлов

Синхронная запись файлов означает останов Nodejs от выполнения последующих частей кода до завершения записи. Асинхронное программирование — это когда функция может извлекать данные, не останавливая выполнение следующих блоков кода.

Хотя запись файла Nodejs по умолчанию является асинхронной, она позволяет управлять потоком программы с помощью синхронных функций. Вот почему асинхронный 9Методы модуля 0005 fs имеют синхронные версии, обозначаемые Sync . Например, вы можете использовать метод writeFile() или метод writeFileSync() для записи файлов Nodejs.

 

Типы данных и кодировка

Это поможет понять буфер, строку, utf-8 и типы объектных файлов и их преобразования, прежде чем приступить к практической записи файла Nodejs.

Реклама

Буфер — это двоичные данные, расположенные в памяти. Такие данные называются необработанными, потому что компьютер в основном понимает двоичные (1 и 0) данные. Преобразование данных в другие формы требует стандартизации, чтобы приспособиться к эволюции вычислений и человеческим языкам.

Одним из стандартов является ASCII, который отображает цифры в символы перед декодированием данных в двоичный код. Еще одним стандартом кодирования данных является utf-8 , который преобразует двоичные данные в строки для более легкой передачи через Интернет.

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

 постоянные люди = {
    имя: "Раджеш",
    электронная почта: "[email protected]"
} 

Где имя и электронная почта являются ключами, а кавычки являются значениями. Когда ключи заключены в кавычки, объект называется нотацией объектов JavaScript (JSON).

ТАКЖЕ ПРОЧИТАЙТЕ: [решено]: как использовать jQuery с Node.js с примерами

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

Теперь, когда вы понимаете, с какими типами данных мы будем работать в этом руководстве, давайте узнаем, как их хранить.

Реклама

 

Типы файлов

Тип файла определяет типы данных для хранения. Например, файлы .txt в основном хранят текст без специальных тегов или средств. .html В файлах хранится (тегированное) HTML-содержимое. Файлы .js обрабатывают код, предназначенный для движков JavaScript, а файлы .json хранят только файлы JSON.

Список типов файлов, с которыми вы можете работать, может быть длиннее, чем описано здесь. Тем не менее, мы не будем их рассматривать, так как вам будет удобно манипулировать ими после того, как Nodejs запишет файлы, оканчивающиеся на 9.0005 .txt , .html , .js и .json .

Давайте сделаем это прямо сейчас.

 

Лабораторная установка для отработки файла записи Nodejs

Основным требованием для следующих разделов является наличие Node.js версии 17.6 или выше и редактор кода, такой как Visual Studio Code.

После установки Nodejs и редактора кода давайте продолжим и создадим рабочий каталог. Я создаю папку с именем nodejs_write_file с файлом с именем index.js , а затем открыть его с помощью Visual Studio Code.

После этого мы можем посмотреть на несколько примеров.

Реклама

 

Пример 1: Nodejs записывает файлы различных типов

Импорт модуля fs .

 const fs = require('fs') 

Запись файлов test.txt , index.html и main.js .

ТАКЖЕ ЧИТАЙТЕ: как использовать Node.js с Sublime Text IDE

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

Новые файлы появляются при запуске файла index. js с узлом.

 node index.js 

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

 // текст
fs.writeFileSync('test.txt', 'Текстовый файл')
// html
fs.writeFileSync('index.html', ' 

Записать файл Node.js

') // js fs.writeFileSync('main.js', 'const age = 27')

На этот раз мы должны использовать try/catch для обработки ошибок.

Реклама

 попробовать {
    fs.writeFileSync('anotherFile.js', console.log('Ловите ошибки!'))
} поймать (е) {
    console.log(е)
} 

Метод writeFile() перезаписывает содержимое файла новыми данными. Было бы лучше, если бы вы использовали appendFile() для записи дополнительного содержимого в существующий файл.

 

Пример 2. Добавление содержимого к данным существующего файла

Предположим, мы хотим напечатать возраст в файле main.js . Мы можем сделать это, используя метод appendFile() модуля fs .

 fs.appendFile('main.js', '\n console.log(age)', ошибка => {
   если (ошибка) console.log (ошибка)
   console.log('Добавлено!')
}) 

Пишем console.log(age) на новую строку в файле main.js с помощью \n . Затем мы проверяем наличие ошибок. Если ошибки нет, мы убедимся в успешности процесса, запустив сообщение, зарегистрированное в консоли: Добавлено!

 

ТАКЖЕ ЧИТАЙТЕ: Целочисленное деление JavaScript [3 метода]

Пример 3: Чтение и запись файла с внешними данными

Другой типичный способ записи файлов Nodejs — получение данных из API. Предположим, мы хотим получить первых трех пользователей из JSON Placeholder API и записать их в новый файл с именем users.json .

 const storeUsers = async () => {
    const res = await fetch('https://jsonplaceholder.typicode.com/users?_start=0&_limit=3')
    константные данные = ожидание res.json()
    fs.writeFile('users. json', JSON.stringify(data, null, 2), e => e ? console.log(e): '')
}
storeUsers() 

Мы создаем функцию storeUsers() для удаленного извлечения данных и записи их в файл с помощью метода writeFile() . Перед сохранением данных мы преобразуем их в строку с помощью метода JSON stringify() . В противном случае мы регистрируем ошибку в консоли.

Система должна создать файл users.json при запуске файла main.js . Новый файл должен содержать следующие данные.

Реклама

 [
  {
 "идентификатор": 1,
 "name": "Лиэнн Грэм",
 "имя пользователя": "Брет",
 "email": "[email protected]",
 "адрес": {
 "улица": "Кулас Лайт",
 "сьют": "Кв. 556",
 "город": "Гвенборо",
 "почтовый индекс": "92998-3874",
 "гео": {
 "лат": "-37.3159",
 "длинный": "81.1496"
 }
 },
 "телефон": "1-770-736-8031 x56442",
 "веб-сайт": "hildegard.org",
 "Компания": {
 "имя": "Ромагера-Крона",
 "catchPhrase": "Многоуровневая нейронная сеть клиент-сервер",
 "bs": "использовать электронные рынки в режиме реального времени"
 }
  },
  {
 "идентификатор": 2,
 "name": "Эрвин Хауэлл",
 "имя пользователя": "Антонетта",
 "email": "Шанна@melissa. tv",
 "адрес": {
 "улица": "Виктор Плейнс",
 "Люкс": "Люкс 879",
 "город": "Визокибург",
 "почтовый индекс": "90566-7771",
 "гео": {
 "лат": "-43.9509",
 "лнг": "-34,4618"
 }
 },
 "телефон": "010-692-6593 x09125",
 "веб-сайт": "anastasia.net",
 "Компания": {
 "name": "Декоу-Крист",
 "catchPhrase": "Упреждающая дидактическая помощь",
 "bs": "синергизировать масштабируемые цепочки поставок"
 }
  },
  {
 "идентификатор": 3,
 "name": "Клементина Баух",
 "имя пользователя": "Саманта",
 "email": "Натан@yesenia.net",
 "адрес": {
 "улица": "Дуглас Расширение",
 «Люкс»: «Люкс 847»,
 "город": "Маккензихейвен",
 "почтовый индекс": "59590-4157",
 "гео": {
 "лат": "-68.6102",
 "лнг": "-47.0653"
 }
 },
 "телефон": "1-463-123-4447",
 "веб-сайт": "ramiro.info",
 "Компания": {
 "имя": "Ромагера-Джейкобсон",
 "catchPhrase": "Раздвоенный интерфейс лицом к лицу",
 "bs": "Электронная поддержка стратегических приложений"
 }
  }
] 

Вы можете получить некоторые предупреждения в выводе консоли, поскольку fetch API является экспериментальной функцией в Node. js при написании этого руководства.

ТАКЖЕ ЧИТАЙТЕ: проверьте, содержит ли строка пробелы в JS [РЕШЕНО]

 

Пример 4: Nodejs записывает файл после чтения содержимого из другого локального файла

Наконец, давайте прочитаем данные файла users.json и запишите его в файл newFile.json .

 fs.readFile('users.json', 'utf-8', (ошибка, данные) => {
    если(ошибка) console.log(ошибка)
    fs.writeFile('newFile.json', data, e => e ? console.log(e): '')
}) 

С Метод readFile() возвращает буфер, мы преобразуем данные в строку, используя utf-8 перед запуском функции обратного вызова с объектом ошибки и данными (ответа).

Допустим есть ошибка, система ее печатает. В противном случае мы получаем ожидаемые (строковые) данные. Наконец, мы записываем данные в файл newFile.json .

 

Заключение

Записать файл Nodejs легко, если вы понимаете модуль fs , типы файлов и кодировку. Затем вы можете записать файл с данными из локального файла или получить данные удаленно.

 

Редактирование JavaScript | Bootstrap Studio

С помощью нашего редактора JavaScript вы можете превратить свой красивый дизайн в полнофункциональный веб-сайт. Вы получаете доступ к мощному редактированию, подобному Sublime Text, с несколькими курсорами и сочетаниями клавиш.

Файлы JS

Для начала необходимо создать файл JavaScript на панели «Дизайн». Вы можете сделать это, щелкнув правой кнопкой мыши группу «JavaScript» и выбрав меню New > JS File .

В том же меню есть еще пара опций:

  • Файл JSON — Создать файл JSON (откроется в новом окне) для хранения данных. Эти файлы можно редактировать в приложении так же, как обычные файлы JS, но они используются для хранения статических данных.
  • Модуль JS — Добавьте файл MJS в свой проект. Это тип файла, который в основном взаимозаменяем с обычными файлами JS, но специально используется при написании модулей JS (opens new window).
  • Папка — Создайте папку для организации ваших активов. Папки могут быть вложены друг в друга.

Примечание

Если вы используете OS X и щелчок правой кнопкой мыши по метке «JavaScript» ничего не делает, попробуйте метод Ctrl + Click или проверьте, включен ли щелчок правой кнопкой мыши в настройках вашего компьютера.

Импорт файлов JS

Чтобы импортировать существующий файл JS, просто перетащите его в окно приложения или щелкните правой кнопкой мыши JavaScript и выберите Import JS File .

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

Примечания

  • При импорте файлов js вы делаете их копию в своем проекте. Любые изменения, сделанные в исходном файле, не будут отображаться в вашем проекте. Если это не то, что вам нужно, вместо этого вы можете связать файлы JS.
  • Имейте в виду, что файлы jQuery (если они включены) и файлы Bootstrap JS импортируются в Bootstrap Studio автоматически, их не нужно включать снова.

Порядок файлов JS

При работе с несколькими файлами JS иногда требуется указать порядок включения. Для этого щелкните правой кнопкой мыши группу JavaScript и выберите Include Order .

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

Примечание

Файл JS платформы Bootstrap всегда включается первым на страницу перед любым другим кодом.

Видимость

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

Редактирование JS

Чтобы отредактировать файл JavaScript, просто дважды щелкните его. Это откроет файл на панели редактора в новой вкладке.

Когда вы нажимаете кнопку Применить (или нажимаете Ctrl/Cmd + S ), предварительный просмотр автоматически перезагружается, чтобы вы могли немедленно опробовать свои изменения (дополнительную информацию см. в нашем руководстве по предварительному просмотру и экспорту).

Настройки редактора

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

Существует также ряд параметров настройки, доступных из контекстного меню редактора.

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

Bootstrap Studio позволяет вам связывать внешние файлы JS без их импорта, что может быть полезно для таких вещей, как библиотеки JS. Щелкните правой кнопкой мыши JavaScript и выберите Link External JS .

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