Чтение онлайн

ЖАНРЫ

JavaScript. Подробное руководство, 6-е издание
Шрифт:

// ей нужно передать функцию обратного вызова

function fileCopy(filename1, filename2, done) {

var input = fs.createReadStream(filenamel); // Входной поток

var output = fs.createWriteStream(filename2); // Выходной поток

input.on("data", function(d) { output.write(d); }); // Копировать

input.on("error", function(err) { throw err; }); // Сообщить
об ошибке

input.on("end", function { // По исчерпании входных данных

output.end; // закрыть выходной поток

if (done) done; // И известить вызвавшую программу

});

}

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

#! /usr/local/bin/node

var fs = require("fs"), path = require("path"); // Загрузить модули

var dir = process.cwd; // Текущий каталог

var files = fs.readdirSync(dir); // Или из команд. строки

var files = fs.readdirSync(dir); // Прочитать содер. кат-га

process.stdout.write("Name\tSize\tDate\n"); // Вывести заголовок

files.forEach(function(filename) { // Для каждого файла

var fullname = path.join(dir,filename); // Объед. имя и каталог

var stats = fs.statSync(fullname); // Получить атрибуты файла

if (stats.isDirectory) filename += "/"; // Пометить подкаталоги

process.stdout.write(filename + // Вывести имя файла

"\t" + stats.size + "\t" + // размер файла

stats.mtime + ”\n"); // и время поcл. изменения

});

Обратите внимание на комментарий #! в первой строке, в примере выше. Это специальный комментарий, используемый в Unix, чтобы объявить сценарий, следующий далее, исполняемым, определив файл интерпретатора, который должен его выполнить. Интерпретатор Node игнорирует подобные строки комментариев, когда они находятся в первых строках файлов.

Модуль «net» определяет API для организации взаимодействий по протоколу TCP. (Для выполнения сетевых взаимодействий на основе дейтаграмм можно использовать модуль «dgram».) Ниже приводится пример очень простого сетевого TCP-сервера, реализованного на основе особенностей Node:

// Простой эхо-сервер, реализованный на
основе особенностей Node:

// он ожидает соединений на порту с номером 2000 и отправляет обратно клиенту

// все данные, которые получит от него.

var net = require('net');

var server = net.createServer;

server.listen(2000, function {
console.log("Прослушивается порт 2000");
});

server.on("connection", function(stream) {

console.log("Принято соединение от", stream.remoteAddress);

stream.on("data", function(data) { stream.write(data); });

stream.on("end", function(data) { console.log("Соединение закрыто"); });

});

В дополнение к базовому модулю «net» в интерпретаторе Node имеется встроенная поддержка протокола HTTP в виде модуля «http». Особенности его использования демонстрируют примеры, следующие ниже.

12.2.1. Пример использования Node: HTTP-сервер

В примере 12.2 приводится реализация простого HTTP-сервера, основанная на особенностях интерпретатора Node. Она обслуживает файлы в текущем каталоге и дополнительно реализует два адреса URL специального назначения, которые обслуживаются особым образом. В этой реализации используется модуль «http», входящий в состав интерпретатора Node, и применяются API доступа к файлам и потокам ввода/вывода, демонстрировавшиеся выше. В примере 18.17, в главе 18, демонстрируется аналогичный специализированный НТТР-сервер.

Пример 12.2. HTTP-сервер, основанный на особенностях Node

// Простой NodeJS HTTP-сервер, обслуживающий файлы в текущем каталоге

// и реализующий два специальных адреса URL для нужд тестирования.

// Подключение к серверу выполняется по адресу http://localhost;8000

// или http://127.0-0.1:8000

// Сначала необходимо загрузить используемые модули

var http = require( http'); // API НТТР-сервера

var fs = require('fs'); // Для работы с локальными файлами

var server = new http.Server; // Создать новый HTTP-сервер

server.listen(8000); // Прослушивать порт 8000.

// Для регистрации обработчиков событий в Node используется метод "оп".

Поделиться с друзьями: