Выбрать главу

Такой принцип работы принят в 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 запроса.