Глобальные объекты 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.js
Hello, 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:

Нет.Метод и описание
1console.log([data][, ...])
Выводит символы в стандартный поток вывода и завершается символом новой строки. Этот метод принимает несколько параметров. Если параметр только один, он выводит строковое представление этого параметра. Если параметров несколько, он выводит их в формате, аналогичном команде printf() языка C.
2console.info([data][, ...])
Эта команда используется для вывода информационного сообщения. Эта команда не сильно отличается от console.log, за исключением того, что в Chrome она выводит только текст, а в других отображает синий восклицательный знак.
3console.error([data][, ...])
Выводит сообщения об ошибках. При возникновении ошибки консоль отображает красный крестик.
4console.warn([data][, ...])
Выводит предупреждающие сообщения. В консоли отображается жёлтый восклицательный знак.
5console.dir(obj[, options])
Используется для проверки объекта и отображения его в удобочитаемом и пригодном для печати формате.
6console.time(label)
Выводит время, указывая начало отсчёта.
7console.timeEnd(label)
Завершает отсчёт времени, указывая его окончание.
8console.trace(message[, ...])
Путь вызова текущего исполняемого кода в стеке. Это очень полезно для тестирования выполнения функций; просто добавьте console.trace внутрь функции, которую вы хотите протестировать.
9console.assert(value[, message][, ...])
Используется для определения, является ли выражение или переменная истинными. Он принимает два параметра: первый — выражение, второй — строка. Только когда первый параметр ложен, будет выведен второй параметр; в противном случае результата не будет.
console.log(): выводит символы в стандартный поток вывода и завершает строку символом новой строки.

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.

Нет.Событие и описание
1exit
Срабатывает, когда процесс собирается завершиться.
2beforeExit
Это событие срабатывает, когда node опустошает цикл событий и не имеет других запланированных задач. Обычно node завершается, когда нет запланированных задач, но слушатели 'beforeExit' могут вызываться асинхронно, поэтому node продолжит выполнение.
3uncaughtException
Срабатывает, когда исключение всплывает обратно в цикл событий. Если для исключения добавлен слушатель, действие по умолчанию (печать трассировки стека и выход) не произойдёт.
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 предоставляет множество полезных свойств, помогающих нам лучше управлять взаимодействием с системой:

Нет.Свойство & Описание
1stdout
Стандартный поток вывода.
2stderr
Стандартный поток ошибок.
3stdin
Стандартный поток ввода.
4argv
Свойство argv возвращает массив, состоящий из различных аргументов при выполнении скрипта из командной строки. Его первый элемент всегда node, второй элемент — имя файла скрипта, а остальные элементы — аргументы файла скрипта.
5execPath
Возвращает абсолютный путь к исполняемому файлу Node, выполняющему текущий скрипт.
6execArgv
Возвращает массив, элементами которого являются аргументы командной строки между исполняемым файлом Node и файлом скрипта, когда скрипт выполняется из командной строки.
7env
Возвращает объект, свойствами которого являются переменные окружения текущей оболочки.
8exitCode
Код выхода при завершении процесса. Если процесс завершается через process.exit(), нет необходимости указывать код выхода.
9version
Версия Node, например v0.10.18.
10versions
Свойство, содержащее версию Node и зависимости.
11config
Объект, содержащий параметры конфигурации JavaScript, используемые для компиляции текущего исполняемого файла Node. Он совпадает с файлом "config.gypi", создаваемым при запуске сценария ./configure.
12pid
Идентификатор процесса текущего процесса.
13title
Имя процесса со значением по умолчанию "node"; это значение можно настроить.
14arch
Текущая архитектура процессора: 'arm', 'ia32' или 'x64'.
15платформа
Платформа, на которой выполняется программа: 'darwin', 'freebsd', 'linux', 'sunos' или 'win32'.
16mainModule
Альтернатива 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 предоставляет множество полезных методов, помогающих нам лучше управлять взаимодействием с системой:

Нет.Метод и описание
1abort()
Это приведёт к тому, что Node вызовет событие abort. Это приведёт к завершению Node и созданию core-файла.
2chdir(directory)
Изменяет рабочий каталог текущего процесса; выбрасывает исключение, если операция не удалась.
3cwd()
Возвращает рабочий каталог текущего процесса.
4exit([code])
Завершает процесс с указанным кодом. Если он опущен, будет использован код 0.
5getgid()
Получает идентификатор группы процесса (см. getgid(2)). Возвращается числовой идентификатор группы, а не имя.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
6setgid(id)
Устанавливает идентификатор группы процесса (см. setgid(2)). Может принимать числовой ID или имя группы. Если указано имя группы, он блокируется в ожидании его преобразования в числовой ID.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
7getuid()
Получает идентификатор пользователя процесса (см. getuid(2)). Это числовой ID пользователя, а не имя пользователя.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
8setuid(id)
Устанавливает идентификатор пользователя процесса (см. setuid(2)). Принимает числовой ID или строковое имя. Если указано имя группы, он блокируется в ожидании его преобразования в числовой ID.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
9getgroups()
Возвращает массив идентификаторов групп процесса. POSIX-системы не гарантируют их наличие, но node.js гарантирует это.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
10setgroups(groups)
Устанавливает идентификаторы групп процесса. Это привилегированная операция, поэтому требуются права root или возможность CAP_SETGID.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
11initgroups(user, extra_group)
Читает /etc/group и инициализирует список групп доступа, используя все группы, к которым принадлежит участник. Это привилегированная операция, поэтому требуются права root или возможность CAP_SETGID.
Примечание: эта функция доступна только на платформах POSIX (например, не Windows и не Android).
12kill(pid[, signal])
Отправляет сигнал процессу. pid — это идентификатор процесса, а signal — строковое описание отправляемого сигнала. Имена сигналов являются строками, например 'SIGINT' или 'SIGHUP'. Если не указано, сигнал будет 'SIGTERM'.
13memoryUsage()
Возвращает объект, описывающий использование памяти процессом Node, в байтах.
14nextTick(callback)
Вызывает функцию callback после завершения текущего цикла событий.
15umask([mask])
Устанавливает или считывает файловую маску процесса (umask). Дочерние процессы наследуют маску от родительского процесса. Если аргумент mask допустим, возвращается старая маска. В противном случае возвращается текущая маска.
16uptime()
Возвращает количество секунд, прошедших с момента запуска Node.
17hrtime()
Возвращает высокоточное время текущего процесса в виде массива [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 }
Другие расширения