Глобальные объекты Node.js
В JavaScript есть специальный объект, называемый глобальным объектом. К нему и всем его свойствам можно получить доступ в любом месте программы, то есть это глобальные переменные.
В JavaScript в браузере window обычно является глобальным объектом, тогда как в Node.js глобальным объектом является global. Все глобальные переменные (кроме самого global) являются свойствами глобального объекта.
В Node.js мы можем напрямую обращаться к свойствам global, не включая его в приложение.
Глобальные объекты и глобальные переменные
Самая фундаментальная роль global — служить контейнером для глобальных переменных. Согласно определению ECMAScript, переменные, удовлетворяющие следующим условиям, являются глобальными переменными:
- Переменные, определённые на самом внешнем уровне;
- Свойства глобального объекта;
- Неявно определённые переменные (переменные, которым значение присвоено напрямую без определения).
Когда вы определяете глобальную переменную, эта переменная также становится свойством глобального объекта, и наоборот. Следует отметить, что в Node.js нельзя определять переменные на самом внешнем уровне, потому что весь пользовательский код принадлежит текущему модулю, а сам модуль не является самым внешним контекстом.
Примечание:Лучше не использовать var для определения переменных, чтобы избежать появления глобальных переменных, поскольку глобальные переменные загрязняют пространство имён и повышают риск связанности кода.
__filename
__filenameПредставляет имя файла текущего выполняемого скрипта. Он выводит абсолютный путь к местоположению файла, и он может не совпадать с именем файла, указанным в аргументах командной строки. Если в модуле, возвращаемое значение — это путь к файлу модуля.
Пример
Создайте файл main.js со следующим кодом:
// 输出全局变量 __filename 的值 console.log( __filename );
Запустите файл main.js, код выглядит следующим образом:
$ node main.js /web/com/example/nodejs/main.js
__dirname
__dirnameПредставляет каталог, в котором находится текущий выполняемый скрипт.
Пример
Создайте файл main.js со следующим кодом:
// 输出全局变量 __dirname 的值 console.log( __dirname );
Запустите файл main.js, код выглядит следующим образом:
$ node main.js /web/com/example/nodejs
setTimeout(cb, ms)
setTimeout(cb, ms)Глобальная функция выполняет указанную функцию (cb) через указанное количество миллисекунд (ms). setTimeout() выполняет указанную функцию только один раз.
Возвращает значение дескриптора, представляющее таймер.
Пример
Создайте файл main.js со следующим кодом:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setTimeout(printHello, 2000);
Запустите файл main.js, код выглядит следующим образом:
$ node main.js Hello, World!
clearTimeout(t)
clearTimeout( t )Глобальная функция используется для остановки таймера, ранее созданного с помощью setTimeout(). Параметрt— это таймер, созданный функцией setTimeout().
Пример
Создайте файл main.js со следующим кодом:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);
// 清除定时器
clearTimeout(t);
Запустите файл main.js, код выглядит следующим образом:
$ node main.js
setInterval(cb, ms)
setInterval(cb, ms)Глобальная функция выполняет указанную функцию (cb) через указанное количество миллисекунд (ms).
Возвращает значение дескриптора, представляющее таймер. Вы можете использоватьclearInterval(t)функцию для очистки таймера.
Метод setInterval() будет непрерывно вызывать функцию до тех пор, пока не будет вызван clearInterval() или не будет закрыто окно.
Пример
Создайте файл main.js со следующим кодом:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setInterval(printHello, 2000);
Запустите файл main.js, код выглядит следующим образом:
$ node main.jsHello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……
Вышеприведённая программа будет выводить "Hello, World!" каждые две секунды и будет выполняться вечно, пока вы не нажмётеctrl + cкнопку.
console
console используется для обеспечения стандартного вывода на консоль. Это инструмент отладки, предоставленный движком JScript Internet Explorer, и позже постепенно стал стандартом реализации для браузеров.
Node.js следует этому стандарту и предоставляет объект console, соответствующий привычному поведению, используемый для вывода символов в стандартный поток вывода (stdout) или стандартный поток ошибок (stderr).
Методы console
Ниже перечислены методы объекта console:
| Нет. | Метод и описание |
|---|---|
| 1 | console.log([data][, ...]) Выводит символы в стандартный поток вывода и завершается символом новой строки. Этот метод принимает несколько параметров. Если параметр только один, он выводит строковое представление этого параметра. Если параметров несколько, он выводит их в формате, аналогичном команде printf() языка C. |
| 2 | console.info([data][, ...]) Эта команда используется для вывода информационного сообщения. Эта команда не сильно отличается от console.log, за исключением того, что в Chrome она выводит только текст, а в других отображает синий восклицательный знак. |
| 3 | console.error([data][, ...]) Выводит сообщения об ошибках. При возникновении ошибки консоль отображает красный крестик. |
| 4 | console.warn([data][, ...]) Выводит предупреждающие сообщения. В консоли отображается жёлтый восклицательный знак. |
| 5 | console.dir(obj[, options]) Используется для проверки объекта и отображения его в удобочитаемом и пригодном для печати формате. |
| 6 | console.time(label) Выводит время, указывая начало отсчёта. |
| 7 | console.timeEnd(label) Завершает отсчёт времени, указывая его окончание. |
| 8 | console.trace(message[, ...]) Путь вызова текущего исполняемого кода в стеке. Это очень полезно для тестирования выполнения функций; просто добавьте console.trace внутрь функции, которую вы хотите протестировать. |
| 9 | console.assert(value[, message][, ...]) Используется для определения, является ли выражение или переменная истинными. Он принимает два параметра: первый — выражение, второй — строка. Только когда первый параметр ложен, будет выведен второй параметр; в противном случае результата не будет. |
console.log принимает несколько параметров. Если есть только один параметр, он выводит строковую форму этого параметра. Если параметров несколько, он выводит в формате, аналогичном команде printf() языка C.
Первый параметр — строка. Если параметров нет, он выводит только символ новой строки.
console.log('Hello world');
console.log('byvoid%diovyb');
console.log('byvoid%diovyb', 1991);
Результат выполнения:
Hello world byvoid%diovyb byvoid1991iovyb
- console.error(): то же использование, что и console.log(), за исключением того, что он выводит в стандартный поток ошибок.
- console.trace(): выводит текущий стек вызовов в стандартный поток ошибок.
console.trace();
Результат выполнения:
Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)
Пример
Создайте файл main.js со следующим кодом:
console.info("程序开始执行:");
var counter = 10;
console.log("计数: %d", counter);
console.time("获取数据");
//
// 执行一些代码
//
console.timeEnd('获取数据');
console.info("程序执行完毕。")
Запустите файл main.js, код выглядит следующим образом:
$ node main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕
process
process — это глобальная переменная, т. е. свойство глобального объекта.
Это объект, используемый для описания текущего состояния процесса Node.js, предоставляющий простой интерфейс с операционной системой. Обычно, когда вы пишете локальные программы командной строки, вам неизбежно приходится иметь с ним дело. Далее будут представлены некоторые из наиболее часто используемых методов-членов объекта process.
| Нет. | Событие и описание |
|---|---|
| 1 | exit Срабатывает, когда процесс собирается завершиться. |
| 2 | beforeExit Это событие срабатывает, когда node опустошает цикл событий и не имеет других запланированных задач. Обычно node завершается, когда нет запланированных задач, но слушатели 'beforeExit' могут вызываться асинхронно, поэтому node продолжит выполнение. |
| 3 | uncaughtException Срабатывает, когда исключение всплывает обратно в цикл событий. Если для исключения добавлен слушатель, действие по умолчанию (печать трассировки стека и выход) не произойдёт. |
| 4 | Событие сигнала Срабатывает, когда процесс получает сигнал. Список сигналов см. в стандартных именах сигналов POSIX, таких как SIGINT, SIGUSR1 и т. д. |
Пример
Создайте файл main.js со следующим кодом:
process.on('exit', function(code) {
// 以下代码永远不会执行
setTimeout(function() {
console.log("该代码不会执行");
}, 0);
console.log('退出码为:', code);
});
console.log("程序执行结束");
Запустите файл main.js, код выглядит следующим образом:
$ node main.js 程序执行结束 退出码为: 0
Коды состояния выхода
| Код состояния | Имя и описание |
|---|---|
| 1 | Необработанное фатальное исключение Возникло необработанное исключение, и оно не было обработано доменом или обработчиком uncaughtException. |
| 2 | Не используется Зарезервировано, зарезервировано Bash для неправильного использования встроенных команд. |
| 3 | Внутренняя ошибка разбора JavaScript Ошибка разбора, возникающая при запуске процесса Node с исходным кодом JavaScript. Очень редко, возникает только при разработке Node. |
| 4 | Внутренний сбой вычисления JavaScript Сбой возврата функции при вычислении исходного кода JavaScript для запуска процесса Node. Очень редко, возникает только при разработке Node. |
| 5 | Фатальная ошибка Фатальная и неустранимая ошибка в V8. Обычно выводится в stderr с текстом: FATAL ERROR. |
| 6 | Внутренний обработчик исключений не является функцией Неперехваченное исключение, и по какой-то причине внутренняя функция обработчика исключений не является функцией и не может быть вызвана. |
| 7 | Сбой внутреннего обработчика исключений во время выполнения Неперехваченное исключение, и сам обработчик исключений выбросил исключение во время его обработки. Например, если process.on('uncaughtException') или domain.on('error') выбросили исключение. |
| 8 | Не используется Зарезервировано. В предыдущих версиях Node.js код выхода 8 иногда указывал на неперехваченное исключение. |
| 9 | Недопустимый аргумент Возможно, был передан неизвестный аргумент или у переданного аргумента не было значения. |
| 10 | Внутренний сбой среды выполнения JavaScript Ошибка, возникающая, когда исходный код JavaScript запускает процесс Node; очень редкая и возникает только при разработке самого Node. |
| 12 | Недопустимый аргумент отладки Был задан параметр --debug и/или --debug-brk, но был выбран неправильный порт. |
| 128 | Завершения по сигналу Если Node получает фатальный сигнал, такой как SIGKILL или SIGHUP, то код выхода равен 128 плюс код сигнала. Это стандартная практика Unix, при которой код сигнала выхода помещается в старшие биты. |
Свойства Process
Process предоставляет множество полезных свойств, помогающих нам лучше управлять взаимодействием с системой:
| Нет. | Свойство & Описание |
|---|---|
| 1 | stdout Стандартный поток вывода. |
| 2 | stderr Стандартный поток ошибок. |
| 3 | stdin Стандартный поток ввода. |
| 4 | argv Свойство argv возвращает массив, состоящий из различных аргументов при выполнении скрипта из командной строки. Его первый элемент всегда node, второй элемент — имя файла скрипта, а остальные элементы — аргументы файла скрипта. |
| 5 | execPath Возвращает абсолютный путь к исполняемому файлу Node, выполняющему текущий скрипт. |
| 6 | execArgv Возвращает массив, элементами которого являются аргументы командной строки между исполняемым файлом Node и файлом скрипта, когда скрипт выполняется из командной строки. |
| 7 | env Возвращает объект, свойствами которого являются переменные окружения текущей оболочки. |
| 8 | exitCode Код выхода при завершении процесса. Если процесс завершается через process.exit(), нет необходимости указывать код выхода. |
| 9 | version Версия Node, например v0.10.18. |
| 10 | versions Свойство, содержащее версию Node и зависимости. |
| 11 | config Объект, содержащий параметры конфигурации JavaScript, используемые для компиляции текущего исполняемого файла Node. Он совпадает с файлом "config.gypi", создаваемым при запуске сценария ./configure. |
| 12 | pid Идентификатор процесса текущего процесса. |
| 13 | title Имя процесса со значением по умолчанию "node"; это значение можно настроить. |
| 14 | arch Текущая архитектура процессора: 'arm', 'ia32' или 'x64'. |
| 15 | платформа Платформа, на которой выполняется программа: 'darwin', 'freebsd', 'linux', 'sunos' или 'win32'. |
| 16 | mainModule Альтернатива require.main. Разница в том, что если главный модуль изменяется во время выполнения, require.main может продолжать возвращать старый модуль. Можно считать, что оба ссылаются на один и тот же модуль. |
Пример
Создайте файл с именем main.js со следующим кодом:
// 输出到终端
process.stdout.write("Hello World!" + "\n");
// 通过参数读取
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// 获取执行路径
console.log(process.execPath);
// 平台信息
console.log(process.platform);
Выполните файл main.js со следующим кодом:
$ node main.js Hello World! 0: node 1: /web/www/node/main.js /usr/local/node/0.10.36/bin/node darwin
Справочник по методам
Process предоставляет множество полезных методов, помогающих нам лучше управлять взаимодействием с системой:
| Нет. | Метод и описание |
|---|---|
| 1 | abort() Это приведёт к тому, что Node вызовет событие abort. Это приведёт к завершению Node и созданию core-файла. |
| 2 | chdir(directory) Изменяет рабочий каталог текущего процесса; выбрасывает исключение, если операция не удалась. |
| 3 | cwd() Возвращает рабочий каталог текущего процесса. |
| 4 | exit([code]) Завершает процесс с указанным кодом. Если он опущен, будет использован код 0. |
| 5 | getgid() Получает идентификатор группы процесса (см. getgid(2)). Возвращается числовой идентификатор группы, а не имя. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 6 | setgid(id) Устанавливает идентификатор группы процесса (см. setgid(2)). Может принимать числовой ID или имя группы. Если указано имя группы, он блокируется в ожидании его преобразования в числовой ID. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 7 | getuid() Получает идентификатор пользователя процесса (см. getuid(2)). Это числовой ID пользователя, а не имя пользователя. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 8 | setuid(id) Устанавливает идентификатор пользователя процесса (см. setuid(2)). Принимает числовой ID или строковое имя. Если указано имя группы, он блокируется в ожидании его преобразования в числовой ID. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 9 | getgroups() Возвращает массив идентификаторов групп процесса. POSIX-системы не гарантируют их наличие, но node.js гарантирует это. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 10 | setgroups(groups) Устанавливает идентификаторы групп процесса. Это привилегированная операция, поэтому требуются права root или возможность CAP_SETGID. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 11 | initgroups(user, extra_group) Читает /etc/group и инициализирует список групп доступа, используя все группы, к которым принадлежит участник. Это привилегированная операция, поэтому требуются права root или возможность CAP_SETGID. Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android). |
| 12 | kill(pid[, signal]) Отправляет сигнал процессу. pid — это идентификатор процесса, а signal — строковое описание отправляемого сигнала. Имена сигналов являются строками, например 'SIGINT' или 'SIGHUP'. Если не указано, сигнал будет 'SIGTERM'. |
| 13 | memoryUsage() Возвращает объект, описывающий использование памяти процессом Node, в байтах. |
| 14 | nextTick(callback) Вызывает функцию callback после завершения текущего цикла событий. |
| 15 | umask([mask]) Устанавливает или считывает файловую маску процесса (umask). Дочерние процессы наследуют маску от родительского процесса. Если аргумент mask допустим, возвращается старая маска. В противном случае возвращается текущая маска. |
| 16 | uptime() Возвращает количество секунд, прошедших с момента запуска Node. |
| 17 | hrtime() Возвращает высокоточное время текущего процесса в виде массива [seconds, nanoseconds]. Оно отсчитывается от произвольного события в прошлом. Это значение не связано с датой, поэтому на него не влияет дрейф часов. Его основное назначение — измерять производительность программы с помощью точных временных интервалов. Вы можете передать предыдущий результат в текущий вызов process.hrtime(), который вернёт разницу во времени между ними, для бенчмаркинга и измерения временных интервалов. |
Пример
Создайте файл с именем main.js со следующим кодом:
// 输出当前目录
console.log('当前目录: ' + process.cwd());
// 输出当前版本
console.log('当前版本: ' + process.version);
// 输出内存使用情况
console.log(process.memoryUsage());
Выполните файл main.js со следующим кодом:
$ node main.js
当前目录: /web/com/example/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 } Другие расширения