Основы программирования на JavaScript. Учебное пособие
.pdfТаблица 11. Варианты объектов для заданий 3 - 5
№ |
Вариант 1. Жираф и окапи |
Вариант 2. Домашняя лошадь и |
|
|
лошадь Пржевальского |
3 |
let giraffe = { |
let horse = { |
|
herbivore: true, |
herbivore: true, |
|
age: undefined, |
age: undefined, |
|
presence: null, |
presence: false, |
|
vertebrae: 7, |
year: 1758, |
|
family: 'giraffidae', |
species: 'Equus ferus', |
|
}; |
}; |
|
let okapi = { |
let przewalskisHorse = { |
|
herbivore: true, |
herbivore: true, |
|
age: undefined, |
age: undefined, |
|
presence: false, |
presence: null, |
|
vertebrae: 7, |
year: 1881, |
|
family: 'giraffidae', |
species: 'Equus ferus', |
|
}; |
}; |
4 |
let giraffe = { |
let horse = { |
|
... |
... |
|
designation: { |
designation: { |
|
genus: 'giraffa', |
subspecies: |
|
year: 1762, |
'E.f.caballus', |
|
}, |
chromosomes: 64, |
|
}; |
}, |
|
let okapi = { |
}; |
|
... |
let przewalskisHorse = { |
|
designation: { |
... |
|
genus: 'okapia', |
designation: { |
|
year: 1901, |
subspecies: |
|
}, |
'E.f.przewalskii', |
|
}; |
chromosomes: 66, |
|
|
}, |
|
|
}; |
5 |
let giraffe = { |
let horse = { |
|
... |
... |
|
options: [5, 1000], |
options: [1.75, 650], |
|
}; |
}; |
|
let okapi = { |
let przewalskisHorse = { |
|
... |
... |
|
options: [1.5, 300], |
options: [1.3, 300], |
|
}; |
}; |
7.Даны объекты (табл. 12). Поместить эти объекты в соответствующую иерархию с помощью прототипов.
8.Реализовать задание 7, используя классы. Пример:
class Animal { gender =''; constructor() {
this.setGenderMale();
}
setGenderMale() {
61
this.gender = 'male';
}
}
class Cat extend Animal { type = ''; constructor(){
super(); // Конструктор не обязателен
}
}
const MyCat = new Cat(); console.log('MyCat:', MyCat);
Таблица 12. Варианты объектов для заданий 7
Вариант 1. Транспорт |
Вариант 2. Драгоценные камни |
let vehicle = { |
let emerald = { |
hasWheels: true, |
carats: 0.48, |
speed: 10, |
}; |
}; |
let sapphire = { |
let train = { |
transparency: true, |
speed: 25, |
carats: 0.6, |
}; |
}; |
let maglevTrain = { |
let ruby = { |
speed: 400, |
carats: 0.6, |
}; |
}; |
let boat = { |
let pearl = { |
hasWheels: false, |
transparency: false, |
}; |
}; |
Вариант 3. Деревья |
Вариант 4. Планеты |
let pineTree = { |
let planetEarth = { |
pinopsida: true, |
satellites: 1, |
height: 50, |
}; |
}; |
let planetMars = { |
let birchTree = { |
satellites: 2, |
pinopsida: false, |
}; |
}; |
let planetSaturn = { |
let cedar = { |
hasRings: true, |
height: 40, |
satellites: 62, |
}; |
}; |
let oak = { |
let planetVenus = { |
height: 60, |
hasRings: false, |
}; |
}; |
2.6. Лабораторная работа и практическое занятие № 6. NodeJS и работа с файловой системой
Node.js реализует ввод/вывод файлов с использованием простых оболочек для стандартных функций POSIX. Модуль Node.js FS (File System) не нуждается в предварительной установке перед использованием и может быть импортирован с помощью следующего синтаксиса:
62
const fs = require('fs');
Синхронные и асинхронные методы
Все методы модуля fs по умолчанию являются асинхронными, но большинство из них имеют синхронные версии, имена которых получаются путем добавления слова Sync к именам асинхронных методов.
Асинхронные методы принимают в качестве последнего параметра функции обратного вызова завершения и в качестве первого параметра функции обратного вызова – ошибки.
Например, исследуем метод 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) }
Во втором случае выполнение скрипта будет заблокировано до завершения файловой операции. Более эффективным является использование асинхронного метода, поскольку он не блокирует программу во время ее выполнения.
|
Методы для работы с директориями |
||
|
Рассмотрим |
некоторые методы для работы с директориями |
|
(табл. 13). |
|
|
|
Таблица 13. Методы для работы с директориями |
|||
№ |
Метод |
Назначение |
|
п/п |
|
|
|
1 |
fs.access() |
Проверка существования директории и возмож- |
|
|
|
ности доступа к ней с учетом разрешений |
|
2 |
fs.mkdir() |
Создание новой директории |
|
3 |
fs.readdir() |
Чтение директории |
|
4 |
fs.rename() |
Переименование директории |
|
5 |
fs.rmdir() |
Удаление директории |
|
63
Пример создания новой директории с помощью синхронного метода fs.mkdir():
const fs = require('fs');
const folderName = '/Users/userPC/test' try {
if (!fs.existsSync(dir)){ fs.mkdirSync(dir)
}
}catch (err) { console.error(err) }
Методы для работы с файлами
Получение информации о файле
Для получения системной информации о файле применяются функции fs.statSync()/fs.stat():
fs.statSync('name');
fs.stat('name', function(error,stats){ });
Параметры:
'name' – строка с именем файла, включая путь к нему; function(error,stats){ } – функция обратного вызова, которая вы-
полняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; stats – объект типа fs.Stats.
Объект типа fs.Stats содержит данные:
–dev – номер устройства (это может быть полезным, если у вас несколько разделов или физических дисков);
–mode – содержит много информации, включая тип элемента (файл/директория/символьная ссылка) и права доступа;
–uid – идентификатор владельца элемента;
–gid – идентификатор группы владельца;
–size – размер в байтах;
–atime, mtime и ctime – время последнего доступа, изменения и создания элемента.
Кроме того, в классе fs.Stats содержится несколько важных методов, которые можно использовать для проверки типа файла:
–stats.isFile() — возвращает true, если тип файла — простой
файл;
–stats.isDirectory() — возвращает true, если тип файла — ката-
лог;
–stats.isBlockDevice() — возвращает true, если тип файла — блочное устройство;
–stats.isCharacterDevice() — возвращает true, если тип файла — символьное устройство;
64
–stats.isSymbolicLink() — возвращает true, если тип файла — символьная ссылка;
–stats.isFIFO() — возвращает true, если тип файла — FIFO;
–stats.isSocket() — возвращает true, если тип файла — сокет. Например:
const fs = require('fs'); fs.stat('textFile.txt', (err, stats) => {
if (err) { console.error(err) return
}
stats.isFile() //true stats.isDirectory() //false stats.isSymbolicLink() //false stats.size //1024000 //= 1MB
})
Создание/открытие файла
Для создания и (или) открытия файла применяются функции fs.openSync()/fs.open():
fs.openSync('name', flag);
fs.open('name', flag, function(error,fd){ });
Параметры:
'name' – строка с именем файла, включая путь к нему;
flag – флаг, указывающий режим работы с файлом (права доступа к нему). По умолчанию – чтение и запись;
function(error,fd){ } – функция обратного вызова, которая выполняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; fd – дескриптор файла.
Флаги для операций чтения/записи: r – открыть файл для чтения;
r+ – открыть файл для чтения и записи;
rs – открыть файл для чтения в синхронном режиме;
rs+ – открыть файл для чтения и записи в синхронном режиме; w – открыть файл для записи;
wx – работает как «w», но не выполняется, если путь существу-
ет;
w+ – открыть файл для чтения и записи;
wx+ – работает как «w+», но не выполняется, если путь существует;
a – открыть файл для дополнения;
ax – работает как «а», но не выполняется, если путь существует; a+ – открыть файл для чтения и расширения;
65
ах+ – работает как «a+», но не выполняется, если путь существует.
Например:
const fs = require('fs'); // асинхронный вариант
fs.open('textFile.txt', r+, function(error,fd){ if(error) throw error; // если возникла ошибка console.log('Асинхронное открытие файла');
});
// синхронный вариант console.log('Синхронное открытие файла') let data = fs.openSync('textFile.txt', r+); console.log(data);
Результат:
C:\node\filesapp>node read.js
Синхронное открытие файла Асинхронное открытие файла
C:\node\filesapp>_
Чтение файла
Для чтения файла применяются функции fs.readFileSync()/fs.readFile():
fs.readFileSync('name', 'code'); fs.readFile('name', 'code', function(error,data){
});
Параметры:
–'name' – путь к файлу относительно файла приложения app.js;
–'code' – кодировка для получения текстового содержимого
файла;
– function(error,data){ } – функция обратного вызова, которая выполняется после завершения чтения, где error – параметр, который хранит информацию об ошибке при наличии; data – считанные данные.
Например:
const fs = require('fs'); // асинхронное чтение
fs.readFile('textFile.txt', 'utf8', function(error,data){
console.log('Асинхронное чтение файла'); if(error) throw error; // если возникла ошибка console.log(data); // выводим считанные данные
});
// синхронное чтение console.log('Синхронное чтение файла')
let data = fs.readFileSync('textFile.txt', 'utf8'); console.log(data);
66
Результат:
C:\node\filesapp>node read.js
Синхронное чтение файла
Hello
Асинхронное чтение файла
Hello C:\node\filesapp>_
Функция fs.readFile() вызывается первой, но ее результат выводится в самом конце, так как она асинхронная и не блокирует поток выполнения.
Запись в файл
Чтобы перезаписать содержимое файла, используются функции fs.writeFileSync()/fs.writeFile(), где в качестве первого аргумента при-
нимается имя файла, в качестве второго – данные, которые нужно записать в файл, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.
fs.writeFileSync('name', 'new text'); fs.writeFile('name', 'new text', function(error){
});
Например:
const fs = require('fs');
// асинхронная запись fs.writeFile('textFile.txt', 'Hello', func-
tion(error){
if(error) throw error; // если возникла ошибка console.log('Асинхронная запись файла заверше-
на. Содержимое файла:');
let data = fs.readFileSync('textFile.txt',
'utf8');
console.log(data);
});
Результат:
C:\node\filesapp>node write.js
Асинхронная запись файла завершена. Содержимое файла:
Hello C:\node\filesapp>_
Методы, рассмотренные выше, полностью перезаписывают файл. Если файла, содержимое которого нужно перезаписать, не существует, то он будет создан автоматически.
Если необходимо добавить данные в файл, то применяются функции fs.appendFileSync()/fs.appendFile(), где в качестве первого аргумента принимается имя файла, в качестве второго – данные, которые нужно добавить в конец файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.
67
Например:
const fs = require('fs'); fs.appendFileSync('textFile.txt', ', world'); fs.appendFile('textFile.txt', '!!!', func-
tion(error){
if(error) throw error; // если возникла ошибка console.log('Запись файла завершена. Содержимое
файла:');
let data = fs.readFileSync('textFile.txt',
'utf8');
console.log(data);
});
Результат:
C:\node\filesapp>node write1.js
Запись файла завершена. Содержимое файла:
Hello, world!!! C:\node\filesapp>_
Копирование файла
Для копирования файла используются функции fs.copyFileSync()/fs.copyFile(), где в качестве первого аргумента при-
нимается имя копируемого файла, в качестве второго – имя нового файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.
fs.copyFileSync('name', 'new name');
fs.copyFile(' name ', 'new name', function(error){
});
Например:
const fs = require('fs'); // асинхронное копирование
fs.copyFile('textFile.txt', 'newFile.txt', function(error){
if(error) throw error; // если возникла ошибка console.log('Файл textFile.txt успешно
скопирован в newFile.txt.');
});
// синхронное копирование fs.copyFileSync('textFile.txt', 'nextFile.txt'); console.log('Файл newFile.txt успешно скопирован в
nextFile.txt.');
Результат:
C:\node\filesapp>node copy.js
Файл textFile.txt успешно скопирован в nextFile.txt. Файл textFile.txt успешно скопирован в newFile.txt.
C:\node\filesapp>_
68
Переименование файла
Для переименования файла используются функции fs.renameSync()/fs.rename(), где в качестве первого аргумента принимается исходное имя файла, в качестве второго – новое имя файла, а в качестве третьего (для асинхронного метода) – функция обратного вызова с параметром error.
fs.renameSync('name', 'new name'); fs.rename('name', 'new name', function(error){ });
Например:
const fs = require('fs');
// асинхронное переименование fs.copyFile('newFile.txt', 'newFile1.txt', func-
tion(error){
if(error) throw error; // если возникла ошибка console.log('Файл newFile.txt успешно
переименован в newFile1.txt.');
});
// синхронное переименование fs.copyFileSync('nextFile.txt', 'nextFile1.txt'); console.log('Файл nextFile.txt успешно переименован
в nextFile1.txt.');
Результат:
C:\node\filesapp>node rename.js
Файл nextFile.txt успешно переименован в nextFile1.txt.
Файл newFile.txt успешно переименован в newFile1.txt.
C:\node\filesapp>_
Удаление файла
Для удаления файла используются функции fs.unlinkSync()/fs.unlink(), где в качестве первого аргумента принимается имя удаляемого файла, а в качестве второго (для асинхронного метода) – функция обратного вызова с параметром error.
fs.unlinkSync('name'); fs.unlink('name', function(error){ });
Например:
const fs = require('fs'); // асинхронное удаление
fs.unlink('newFile1.txt', function(error){ if(error) throw error; // если возникла ошибка console.log('Файл newFile1.txt успешно
удален.');
});
// синхронное удаление fs.unlinkSync('nextFile1.txt');
69
console.log('Файл nextFile1.txt успешно удален.');
Результат:
C:\node\filesapp>node delete.js
Файл nextFile1.txt успешно удален. Файл newFile1.txt успешно удален.
C:\node\filesapp>_
Практические задания
1.Создать файловую структуру следующего вида: files
hello.txt
peoples.json data
user.txt
2.Записать в файл «user.txt» данные о себе: ФИО, факультет, курс, № группы.
3.Переименовать файл «user.txt» в «aboutMe.txt».
4.Вывести содержимое файлов «aboutMe.txt» и «hello.txt».
5.Удалить файл «peoples.json».
6.Вывести следующие данные о файле «aboutMe.txt»: размер, дата создания, дата изменения.
7.Выполнить задания 1-6 с использованием асинхронных мето-
дов.
8.Добавить обработку ошибок ко всем операциям.
9.Реализовать функцию, которая получает на вход путь к jsonфайлу, следит за его состоянием и при каждом изменении выводит в консоль список ключей из этого файла.
Примечание. https://nodejs.org/docs/latest/api/fs.html.
2.7. Лабораторная работа и практическое занятие № 7. Модульная система NodeJS
Создание и подключение модулей
Node.js использует модульную систему, которая позволяет разбивать код на отдельные файлы-модули, отвечающие за определенный функционал. Использование модулей наиболее эффективно в больших проектах, так как существенно упрощает понимание и поддержку кода. Например:
export.add = function(a,b) { return a + b;
}
export.multiply = function(a,b) { return a * b;
}
70
