Такой принцип работы принят в Node. Для создания букв figlet
должен прочесть файл с диска, содержащий буквы. Чтение файла – асинхронная операция в Node, поэтому figlet.text
не может вернуть результат немедленно. Асинхронность заразительна – любая функция, вызывающая асинхронную, сама становится асинхронной.
NPM – это больше, чем просто npm install
. Он читает файлы package.json
, содержащие информацию в формате JSON про программу или библиотеку, в частности, на каких библиотеках она основана. Выполнение npm install
в директории, содержащей такой файл, автоматически приводит к установке всех зависимостей, и в свою очередь их зависимостей. Также инструмент npm
используется для размещения библиотек в онлайновом хранилище NPM, чтобы другие люди могли их находить, скачивать и использовать.
Больше мы не будем углубляться в детали использования NPM. Обращайтесь на npmjs.org за документацией поиску библиотек.
Модуль file system
Один из самых востребованных встроенных модулей Node – модуль “fs”
, что означает «файловая система». Модуль обеспечивает функционал для работы с файлами и директориями.
К примеру, есть функция readFile
, читающая файл и делающая обратный вызов с содержимым файла.
var fs = require("fs");
fs.readFile("file.txt", "utf8", function(error, text) {
if (error)
throw error;
console.log("А в файле том было:", text);
});
Второй аргумент readFile
задаёт кодировку символов, в которой нужно преобразовывать содержимое файла в строку. Текст можно преобразовать в двоичные данные разными способами, но самым новым из них является UTF-8. Если у вас нет оснований полагать, что в файле содержится текст в другой кодировке, можно смело передавать параметр "utf8"
. Если вы не задали кодировку, Node выдаст вам данные в двоичной кодировке в виде объекта Buffer
, а не строки. Это массивоподобный объект, содержащий байты из файла.
var fs = require("fs");
fs.readFile("file.txt", function(error, buffer) {
if (error)
throw error;
console.log("В файле было ", buffer.length, " байт.",
"Первый байт:", buffer[0]);
});
Схожая функция, writeFile
, используется для записи файла на диск.
var fs = require("fs");
fs.writeFile("graffiti.txt", "Здесь был Node ", function(err) {
if (err)
console.log("Ничего не вышло, и вот почему:", err);
else
console.log("Запись успешна. Все свободны.");
});
Здесь задавать кодировку не нужно, потому что writeFile
полагает, что если ей на запись дали строку, а не объект Buffer
, то её надо выводить в виде текста с кодировкой по умолчанию UTF-8.
Модуль “fs”
содержит много полезного: функция readdir
возвращает список файлов директории в виде массива строк, stat
вернёт информацию о файле, rename
переименовывает файл, unlink
удаляет, и т. п. См. документацию на nodejs.org.
Многие функции “fs”
имеют как синхронный, так и асинхронный вариант. К примеру, есть синхронный вариант функции readFile
под названием readFileSync
.
var fs = require("fs");
console.log(fs.readFileSync("file.txt", "utf8"));
Синхронные функции использовать проще и полезнее для простых скриптов, где дополнительная скорость асинхронного метода не важна. Но заметьте – на время выполнения синхронного действия ваша программа полностью останавливается. Если ей надо отвечать на ввод пользователя или другим программам по сети, затыки ожидания синхронного I/O приводят к раздражающим задержкам.
Модуль HTTP
Ещё один основной модуль — "http"
. Он даёт функционал для создания HTTP серверов и HTTP-запросов.
Вот всё, что нужно для запуска простейшего HTTP сервера:
var http = require("http");
var server = http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/html"});
response.write("<h1>Привет!</h1><p>Вы запросили `"
request.url + "`</p>");
response.end();
});
server.listen(8000);
Запустив скрипт на своей машины, вы можете направить браузер по адресу localhost:8000/hello, таким образом создав запрос к серверу. Он ответит небольшой HTML-страницей.
Функция, передаваемая как аргумент к createServer
, вызывается при каждой попытке соединения с сервером. Переменные request
и response
– объекты, представляющие входные и выходные данные. Первый содержит информацию по запросу, например свойство url
содержит URL запроса.