JavaScript. Подробное руководство, 6-е издание, стр. 163
Интерпретатор Node построен на основе механизма V8 JavaScript, разработанного компанией Google. Версия Node 0.4 использует версию V8 3.1, которая реализует все особенности ECMAScript 5, за исключением строгого режима.
После загрузки, компиляции и установки Node вы сможете запускать программы, написанные для этого интерпретатора, как показано ниже:
<b>node program.js</b>Знакомство с интерпретатором Rhino мы начали с функций print() и load(). Интерпретатор Node имеет похожие инструменты, но с другими именами:
<b>// Подобно броузерам, для вывода отладочной информации Node определяет </b><b>// функцию console.log().</b><b>console.log("Hello Node"); // Выведет отладочную информацию в консоль </b><b>// Вместо load() в нем используется функция require().</b><b>// Она загружает и выполняет (только один) указанный модуль и возвращает объект,</b><b>// содержащий имена, экспортируемые модулем.</b><b>var fs = require("fs"); // Загрузит модуль ”fs" и вернет объект с его API</b>Интерпретатор Node реализует в глобальном объекте все стандартные конструкторы, свойства и функции, предусмотренные стандартом ECMAScript 5. Однако в дополнение к этому он также поддерживает клиентские функции для работы с таймером:
<b>setTimeout(), setlnterval(), clearTimeout() и clearlnterval():</b><b>//Вывести приветствие через одну секунду. </b><b>setTimeout(function() { console.log( "Привет, Мир!"); }, 1000);</b>Эти глобальные клиентские функции рассматриваются в разделе 14.1. Реализация Node совместима с реализациями интерпретаторов в веб-броузерах.
Интерпретатор Node также определяет и другие глобальные компоненты в пространстве имен process. Ниже перечислены некоторые из свойств этого объекта:
<b>process.version // Строка с версией Node</b><b>process.argv // Аргументы командной строки в виде массива, argv[0] = "node" </b><b>process.env // Переменные окружения в виде объекта.</b><b>// например: process.env.PATH </b><b>process.pid // Числовой идентификатор процесса </b><b>process.getuid() // Возвращает числовой идентификатор пользователя </b><b>process.cwd() // Возвращает текущий рабочий каталог</b><b>process.chdir() // Выполняет переход в другой каталог</b><b>process.exit() // Завершает программу (после запуска всех обработчиков)</b>Поскольку функции и методы, реализуемые интерпретатором Node, являются асинхронными, они не блокируют выполнение программы в ожидании завершения операций. Неблокирующий метод не может вернуть результат выполнения асинхронной операции. Если в программе потребуется получить результат или просто определить, когда завершится операция, необходимо определить функцию, которую интерпретатор Node сможет вызвать, когда результат будет доступен или когда операция завершится (или возникнет ошибка). В некоторых случаях (например, в вызове
<b>setTimeout()</b><b>on()</b><b>emitter.on(name, f) // Регистрирует f для обработки события name,</b><b> // генерируемого объектом emitter</b><b>emitter.addListener(name, f) // То же самое: addListener() - синоним для оп()</b><b>emitter.once(name, f) // Для обработчиков однократного срабатывания,</b><b> // затем f автоматически удаляется </b><b>emitter.listeners(name) // Возвращает массив функций-обработчиков</b><b>emitter.removeListener(name, f) // Удаляет обработчик f</b><b>emitter.removeAHListeners(name) // Удаляет все обработчики события name</b>Объект
<b>process</b><b>// Событие "exit" отправляется перед завершением работы Node, </b><b>process.on("exit", function() { console.log("Goodbye"); });</b><b>// Необработанные исключения генерируют события, если имеется хотя бы один </b><b>// зарегистрированный обработчик. В противном случае исключение </b><b>// заставляет интерпретатор Node вывести сообщение и завершить работу, </b><b>process.on("uncaughtException", function(e) { console.log(Exception, e); });</b><b>// Сигналы POSIX, такие как SIGINT, SIGHUP и SIGTERM, также генерируют события </b><b>process.on("SIGINT", function() { console.logCIgnored Ctrl-C"); });</b>Поскольку интерпретатор Node позволяет выполнять высокопроизводительные операции ввода/вывода, его прикладной интерфейс к потокам ввода/вывода является одним из наиболее часто используемых в программах. Потоки, открытые для чтения, генерируют события, когда появляются данные, готовые для чтения. В следующем примере предполагается, что s - это поток, открытый для чтения, созданный где-то в другом месте программы. Ниже будет показано, как создавать объекты потоков для файлов и сетевых сокетов: