Всем привет! В этой статье мы продолжим разбираться с платформой NodeJS и поговорим про глобальный объект .
Вы уже должны быть знакомы с этим понятием. Когда мы пишем javascript код в браузере, то мы используем глобальный объект window . В NodeJS тоже есть глобальный объект и называется он просто Global .
Также как и window , Global позволяет нам использовать какие-то встроенные свойства и методы из любого места в коде. Давайте рассмотрим примеры.
Наверное, один из самых известных методов, который, кстати, также есть и в браузерном глобальном объекте window – это console.log() . Вы можете написать так:
И код выведет вам в консоль написанный в скобках текст.
Другой известный метод, который позволяет выполнять какое-то действие через заданное время:
// Выполнит код через 7 секунд(7000 миллисекунд)
setTimeout(function() {
console.log("Hello, world!");
}, 7000);
Думаю, не трудно догадаться, что если есть setTimeout() , то должен быть и setInterval() .
// Будет выводить надпись "Hello, world" каждую секунду
setInterval(function() {
console.log("Hello, world!");
}, 1000);
NodeJS позволяет получать некоторую полезную информацию от системы. Например, вы можете узнать полный путь до папки, в которой вы сейчас находитесь, используя свойство глобального объекта __dirname .
Console.log(__dirname);
Если вы также хотите получить имя файла, в котором исполняется код, вы можете написать следующее.
JavaScript имеет специальный объект, называемый глобальный объект (Global Object), его и все его атрибуты могут быть доступны в любом месте программы, глобальной переменной.
Браузер JavaScript обычно является глобальным объектом окна, глобальный объект Node.js является глобальным, все глобальные переменные (за исключением глобальной себя) являются собственностью глобального объекта.
В Node.js нам прямой доступ к глобальным свойствам, без необходимости включать его в заявку.
Глобальные объекты и глобальные переменные
Наиболее фундаментальная глобальная роль как глобальной переменной хоста. По определению ECMAScript отвечают следующие условия являются глобальными переменными:
- Определена переменная Наружная;
- Свойства глобального объекта;
- Переменная неявно определяется (прямое назначение неопределенные переменные).
При определении глобальной переменной, переменная также станет собственностью глобального объекта, и наоборот. Обратите внимание, что, в Node.js вы не можете определить переменные во внешнем, так как все коды пользователей являются частью текущего модуля, а сам модуль не внешний контекст.
Примечание: всегда используйте вар для определения переменных для того, чтобы избежать введения глобальной переменной, поскольку глобальные переменные будут загрязнять пространство имен, увеличивают риск кода связи.
__filename
__filename указывает имя файла сценария в настоящее время выполняется. Абсолютный путь к месту, где он будет выходной файл, а параметр командной строки и укажите имя файла не обязательно то же самое. Если в модуле, возвращенное значение является путь к файлу модуля.
примеров
// 输出全局变量 __filename 的值 console.log(__filename);$ node main.js /web/com/w3big/nodejs/main.js
__dirname
__dirname представляет собой в настоящее время осуществляет каталог сценариев находится.
примеров
Создайте файл main.js, код следующим образом:
// 输出全局变量 __dirname 的值 console.log(__dirname);Исполнительный файл main.js, код выглядит следующим образом:
$ node main.js /web/com/w3big/nodejs
setTimeout (Си-Би, мс)
setTimeout (Си - Би, мс) : Функция SetTimeout () указывается только один раз.
Она возвращает значение дескриптора представляет таймер.
примеров
Создайте файл main.js, код следующим образом:
Function printHello(){ console.log("Hello, World!"); } // 两秒后执行以上函数 setTimeout(printHello, 2000);
Исполнительный файл main.js, код выглядит следующим образом:
$ node main.js Hello, World!
clearTimeout (т)
clearTimeout (т) используется для остановки глобальной функции перед передачей setTimeout () , чтобы создать таймер. ПараметрT функцией setTimeout () , чтобы создать калькулятор.
примеров
Создайте файл main.js, код следующим образом:
Function printHello(){ console.log("Hello, World!"); } // 两秒后执行以上函数 var t = setTimeout(printHello, 2000); // 清除定时器 clearTimeout(t);
Исполнительный файл main.js, код выглядит следующим образом:
$ node main.js
setInterval (Си-Би, мс)
setInterval (Си - Би, мс) глобальная функция выполняет указанную функцию после определенного числа миллисекунд (мс) Номер (CB).
Она возвращает значение дескриптора представляет таймер. Вы можете использовать функцию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.
консоль
Консоль Консоль для обеспечения стандартного вывода, который является средства отладки, предоставляемые двигателем JScript в Internet Explorer, а позже стал стандартом де-факто браузер.
Node.js следует этому стандарту, обеспечивает согласованное поведение и привычки объекта консоли, используемой в стандартный поток вывода (STDOUT) или стандартный поток ошибок (STDERR) выходных символов.
метод консоли
Ниже приведен объект консоли:
Нет. | Метод и описание |
---|---|
1 | console.log ([данные] [, ... ])
Для стандартных печатных символов выходного потока и заканчиваются символом новой строки. Этот метод принимает несколько параметров, если имеется только один параметр, то выход строка этого параметра. Если есть несколько аргументов, такие места, как формат вывода команды на языке С Е (). |
2 | console.info ([данные] [, ... ])
P роль команды возвращает информационное сообщение, команда console.log разница не большая, в дополнение к хрому будет выводиться только текст, остальное покажет синий восклицательный знак. |
3 | console.error ([данные] [, ... ])
Выходное сообщение об ошибке. Консоль будет отображаться красным цветом при возникновении ошибки вилку. |
4 | console.warn ([данные] [, ... ])
Предупреждающее сообщение выводится. Консоль отображается с желтым восклицательным знаком. |
5 | console.dir (OBJ [, опции])
Объект, используемый для проверки (осмотр), и легко читаемый дисплей и печать форматов. |
6 | console.time (ярлык)
Выходной сигнал времени, время начала. |
7 | console.timeEnd (ярлык)
Время окончания, что указывает на окончание времени. |
8 | console.trace (сообщение [, ...])
Код в настоящее время осуществляет путь вызова в стеке, запустить этот тест функция полезна, просто хочу, чтобы проверить функцию которой присоединился console.trace на линии. |
9 | console.assert (значение [, сообщение] [ , ...])
Для определения того, является ли истинная переменная или выражение, потребовалось два параметра, первый параметр является выражением, а второй аргумент является строкой. Только тогда, когда первый аргумент является ложным, то выход будет второй аргумент, он не будет иметь никаких результатов. |
console.log принимает несколько параметров, если имеется только один параметр, выходной строки этого параметра. Если есть несколько аргументов, такие места, как формат вывода команды на языке С Е ().
Первый параметр является строкой, без параметров, только напечатать символ новой строки.
Console.log("Hello world"); console.log("byvoid%diovyb"); console.log("byvoid%diovyb", 1991);
Hello world byvoid%diovyb byvoid1991iovyb
- console.error (): с console.log () использует то же самое, но вывод в стандартный поток ошибок.
- console.trace (): поток ошибок в стандартный вывод текущего стека вызовов.
Операционные результаты следующим образом:
Trace:
at Object.
примеров
Создайте файл main.js, код следующим образом:
Console.info("程序开始执行:"); var counter = 10; console.log("计数: %d", counter); console.time("获取数据"); // // 执行一些代码 // console.timeEnd("获取数据"); console.info("程序执行完毕。")
Исполнительный файл main.js, код выглядит следующим образом:
$ node main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕
процесс
Процесс представляет собой глобальную переменную, атрибут глобальный объект.
Он используется для описания текущего состояния процесса Node.js объекта, он обеспечивает простой интерфейс операционной системы. Обычно вы пишете собственные программы командной строки, и в конечном счете, иметь дело с ним. Ниже будет ввести некоторые из наиболее часто используемых метода процесса возражают члены.
Нет. | События и описание |
---|---|
1 | выход
Срабатывает, когда процесс готов бросить. |
2 | beforeExit
Это событие инициируется, когда узел пустой цикл событий, и никакие другие меры. В общем случае, когда не существует процесса для организации выходного узла, но слушатели "beforeExit" можно назвать асинхронно, так что узел будет продолжаться. |
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 | Uncaught Fatal Exception
Там неперехваченное исключение, и он не был обработан или домен обработчика uncaughtException. |
2 | неиспользуемый
удержание |
3 | Внутренняя ошибка JavaScript Анализировать
JavaScript исходный код разбора ошибки вызывается при запуске процесса Node. Очень редко, только тогда, когда будет в развитии Node. |
4 | Внутренняя неисправность JavaScript Оценка
JavaScript процесс запуска исходного узла, при оценке функции возвращает сбой. Очень редко, только тогда, когда будет в развитии Node. |
5 | Фатальная ошибка
V8 в неисправимой ошибки со смертельным исходом. Обычно печать Stderr, содержание: фатальная ошибка |
6 | Non-Функция внутреннего Исключение Хэндлер
Uncaught исключение, обработчик исключений внутри каким-то образом установить на функции, а также нельзя назвать. |
7 | Внутренняя Исключение обработчика Run-Time Сбой
Uncaught исключение, а обработчик исключений для обработки своих собственных бросает исключение. Например, если process.on ("uncaughtException") или domain.on ("ошибка") вызывает исключение. |
8 | неиспользуемый
удержание |
9 | Недопустимый аргумент
Это может быть неизвестно параметров или параметра до значения. |
10 | Сбой внутреннего JavaScript Run-Time
JavaScript исходный код генерируется при запуске ошибок в процессе узлов, очень редко, только тогда, когда будет в развитии Node. |
12 | Invalid Debug Аргументом
--debug набора параметров и / или --debug-BRK, но выбрал не тот порт. |
> 128 | Выходы сигналов
Если узел получает фатальный сигнал, например, SIGKILL или SIGHUP, то код возврата равен 128 плюс код сигнала. Это стандартная практика Unix, высокий код на выходных сигналов. |
атрибуты процесса
Процесс предоставляет множество полезных свойств, легкость взаимодействия, что мы можем лучше контролировать систему:
Кол-во. | Свойство & Описание |
---|---|
1 | STDOUT
Стандартный выходной поток. |
2 | STDERR
Стандартный поток ошибок. |
3 | STDIN
Стандартный входной поток. |
4 | ARGV
ARGV свойство возвращает массив различных параметров на выполнение сценария командной строки, когда композиция. Его первые члены всегда узел, второй элемент это имя файла сценария, а остальные члены параметры файла сценария. |
5 | execPath
Возвращает абсолютный путь текущего узла двоичных файлов выполнения скрипта. |
6 | execArgv
Возвращает член массива находится под командной строки скрипт выполняется между узлом исполняемым параметрами командной строки файл сценария. |
7 | ENV
Возвращает объект, члены текущей переменной окружения оболочки |
8 | ExitCode
Код выхода для процесса, если процесс подарена process.exit () выхода, без указания кода выхода. |
9 | версия
версия узла, такие v0.10.18. |
10 | версии
Свойство, которое содержит версии узлов и зависимостей. |
11 | конфиг
Объект, который содержит текущий узел используется для компиляции исполняемого файла конфигурации яваскрипта опций. Это тот же запустить./configure скрипт, созданный файл "config.gypi". |
12 | ПИД - регулятора
Номер текущего процесса. |
13 | название
Имя процесса, по умолчанию "узел", вы можете настроить значение. |
14 | арка
Текущая архитектура CPU: "рука", "ia32" или "64". |
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
Метод Справочное руководство
Процесс предоставляет много полезных методов для облегчения более эффективного контроля нашей интерактивной системы:
Нет. | Метод и описание |
---|---|
1 | прервать ()
Это вызовет событие триггера узла прерывания. Это приведет к выходу узла и создать файл дампа. |
2 | ChDir (каталог)
Изменение текущего рабочего каталога процесса, если операция не может бросить. |
3 | УХО ()
Возвращает рабочую директорию текущего процесса |
4 | выход ([код])
Окончание процесса с указанным кодом. Если этот параметр опущен, он будет использовать код 0. |
5 | getgid ()
Получить идентификацию группы процессов (см getgid (2)). Когда группа была приобретена цифровой идентификатор, а не имя. |
6 | setgid (ID)
Настройка процесса идентификации группы (см setgid (2)). ID может принимать цифровое или групповое имя. Если вы указываете имя группы будет разрешено блокировать ждет цифрового идентификатора. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
7 | getuid ()
Получить процесс идентификации пользователя (см getuid (2)). Это числовой идентификатор пользователя, а не имя пользователя. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
8 | УИП (ID)
Идентификатор пользователя настройки процесса (см УИП (2)). Получение цифрового идентификатора или строки имени. Если вы указываете имя группы будет разрешено блокировать ждет цифрового идентификатора. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
9 | getgroups ()
Процесс возвращения ИН группы массив. Система POSIX не гарантирует, что есть, но есть Node.js гарантировано. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
10 | setgroups (группы)
Установить идентификатор группы процесса. Он имеет право работать, все, что вам нужно иметь привилегии суперпользователя, или имеют потенциал CAP_SETGID. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
11 | initgroups (пользователь, extra_group)
Чтение / и т.д. / группу, и инициализирует список доступа к группе, все члены группы расположены. Он имеет право работать, все, что вам нужно иметь привилегии суперпользователя, или имеют потенциал CAP_SETGID. Примечание: Эта функция может быть использована (например, не-Windows и Android) только на POSIX платформах. |
12 | убить (ИДП [сигнал])
Посылает сигнал процессу. ИЗОДРОМНЫЙ идентификатор процесса, а сигнал является строка, обозначающая сигнал, передаваемый. Имена сигналов это строки вроде "SIGINT" или "" SIGHUP. Если этот параметр опущен, то сигнал будет "SIGTERM". |
13 | MemoryUsage ()
Он возвращает объект, который описывает процесс, используемый байты состояния узла памяти. |
14 | nextTick (обратный вызов)
После окончания текущего цикла обработки событий обратного вызова функции. |
15 | Umask ([маска])
Установить или читать процесс маску файла. Дочерние процессы наследуют эту маску из родительского процесса. Если маска аргумент верен, то она возвращает старую маску. В противном случае, она возвращает текущую маску. |
16 | Провел ()
Возвращает количество секунд Node уже запущен. |
17 | hrtime ()
Временное разрешение текущего процесса, в виде [секунд] наносекунд массива. Это относительно любого прошедшего события. Это значение не имеет ничего общего с датой, поэтому не влияет на дрейф часов. Основная цель через точный промежуток времени, чтобы измерить производительность программы. Перед тем, как можно передать результат к текущему process.hrtime (), он вернется к разнице во времени между ними, для опорного и измерения временного интервала. |
примеров
Создайте файл main.js, код следующим образом:
// 输出当前目录 console.log("当前目录: " + process.cwd()); // 输出当前版本 console.log("当前版本: " + process.version); // 输出内存使用情况 console.log(process.memoryUsage());4 из 5
В этой статье я расскажу об основных принципах Node.js, его плюсах и минусах и покажу как начать разработку. Но перед тем как начать работать с Node.js, желательно понять разницу между Node.js и традиционными серверными языками (PHP, Python, Ruby).
Асинхронное программирование
Надеюсь, что вы знакомы с асинхронными программированием. Как ни крути, это основа в Ajax. Все функции базовых модулей в Node.js асинхронны. Поэтому, все функции, которые обычно в других языках блокируют поток, в Node.js вместо этого выполняются в фоне. Это наиболее важная вещь для понимания Node.js. Например, если вы читаете файл, то должна быть указана функция, которая выполнится после завершения чтения.
Ты сделаешь все!
Node.js — всего лишь среда, поэтому всю работу придется делать вручную. В Node.js по умолчанию нет даже HTTP сервера! И это печалит, однако Node.js подкупает высокой производительностью веб-приложений. Всего лишь один скрипт обрабатывает все соединения с клиентом. Такое решение значительно снижает количество используемых ресурсов в приложении. Для примера, вот код простого Node.js приложения.
Var i, a, b, c, max;
max = 1000000000;
var d = Date.now();
for (i = 0; i < max; i++) {
a = 1234 + 5678 + i;
b = 1234 * 5678 + i;
c = 1234 / 2 + i;
}
console.log(Date.now() - d);
А вот его эквивалент на PHP:
$a = null;
$b = null;
$c = null;
$i = null;
$max = 1000000000;
$start = microtime(true);
for ($i = 0; $i < $max; $i++) {
$a = 1234 + 5678 + $i;
$b = 1234 * 5678 + $i;
$c = 1234 / 2 + $i;
}
var_dump(microtime(true) - $start);
В следующей таблице сравнивается время выполнения обоих примеров.
Оба примера выполнялись в командной строке, поэтому задержки на запуск веб-сервера здесь нет. Я запускал каждый тест по 10 раз и взял средний результат. PHP оказался быстрее на малом количестве итераций, но это преимущество быстро исчезает, когда количество итераций увеличивается. Когда я завершил все тесты, то PHP оказался на 93% медленнее Node.js.
Node.js быстр, но существует несколько вещей, которые необходимо знать, чтобы использовать его правильно.
Модули
Node.js построен на модульной архитектуре: это сделано для упрощения создания сложных приложений. Модули похожи на библиотеки в C или units в Pascal. Каждый модуль содержит набор функций, которые относятся к «теме» этого модуля. Например, модуль http содержит функции специфичные для HTTP. Node.js также содержит несколько модулей из коробки: для работы с файловой системой, создания HTTP и TCP/UPD серверов и др.
Модуль подключается с помощью функции require() :
Var http = require("http");
Эта функция возвращает указанный модуль. В примере выше ссылка на модуль http хранится в переменной http.
Функция принимает на вход имя модуля. После этого Node.js проверяет папку node_modules в каталоге приложения и ищет в ней папку с названием http. Если Node.js не нашел каталог node_modules или модуль http внутри этого каталога, тогда он обратиться к глобальному кэшированному модулю. Вместо имени в функцию require() можно передавать относительный или абсолютный путь к модулю:
Var myModule = require("./myModule.js");
Модули инкапсулируют части кода. Код внутри модуля в основном приватный. Это означает, что функции и переменные объявленные в модуле, доступны только внутри модуля. Но Node.js позволяет создавать общедоступные функции или/и переменные. За это отвечает объект exports . Пример:
Var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
В этом примере создается переменная PI, которую можно использовать только внутри модуля. Следующие 2 функции создают объект exports . Эти функции доступны вне модуля, потому что определены через объект exports . В результате переменная PI полностью защищена от внешнего вмешательства. Таким образом функции area и cercumference будут вести себя так как и должны(в зависимости от значения параметра r).
Глобальная область видимости
Node.js — JavaScript среда, разработанная на движке JavaScript V8 от Google. Поэтому необходимо использовать лучшие практики программирования на клиентской стороне. Например, нужно избегать объявлений в глобальной области видимости. Однако это не всегда возможно. В Node.js легко создать глобальную переменную или функцию, опуская ключевое слово var , например:
GlobalVariable = 1;
globalFunction = function () { ... };
Повторю еще раз, глобальных переменных и функций следует избегать, когда это возможно. Так что будьте бдительны — используйте var для объявления переменных!
Установка
Конечно, прежде чем писать и запускать приложения на Node.js, необходимо его установить. На сайте nodejs.org можно скачать инсталлятор для Windows или OS X. Для Linux можно использовать любой пакетный менеджер. Для установки Node.js нужно открыть командную строку и ввести:
Sudo apt-get update
sudo apt-get install node
Sudo aptitude update
sudo aptitude install node
Node.js есть в sid репозиториях; можете добавить их в список исходных кодов:
Sudo echo deb http://ftp.us.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list
Установка sid пакетов на старые системы может повредить вашу систему. Поэтому после установки желательно удалить /etc/apt/sources.list.d/sid.list
Установка новых модулей
В Node.js есть менеджер пакетов, который называется Node Package Manager (NPM). NPM устанавливается автоматически с Node.js, и его можно использовать для установки новых модулей. Чтобы установить новый модуль, нужно открыть командную строку, перейти в нужную папку и выполнить следующую команду:
Npm install module_name
Синтаксис этой команды не зависит от операционной системы. Команда установит модуль, который указан вместо module_name.
Hello World
Первое приложение, которое я напишу на Node.js будет «Hello World!». Для этого, я создам файл, который назову hello.js и добавлю следующий код:
Console.log("Hello World!");
Чтобы выполнить скрипт нужно открыть командную строку и перейти в папку с файлом hello.js и выполнить следующую команду:
Node hello.js
В консоль выведется надпись «Hello World!».
HTTP сервер
Теперь я сделаю приложение посложнее, но не такое сложное как вы могли бы подумать). В коде приведены комментарии.
// подключаем http модуль.
var http = require("http");
// Создаем сервер. Функция передается как параметр при каждом запросе.
// переменная request содержит все параметры запроса.
// переменная response позволяет указать, что нужно делать при отправке ответа клиенту
// Это событие происходит, когда клиент отправил данные и ждет ответ
// Пишем заголовки в ответ.
// 200 это код состояния HTTP (200 означает "хорошо")
// Второй параметр - это объект, который содержит поля заголовка
// Я посылаю обычный текст, с помощью Content-Type со значением text/plain
response.writeHead(200, {
"Content-Type": "text/plain"
});
// Отправляем данные
response.end("Hello HTTP!");
});
// Слушаем 8080 порт.
}).listen(8080);
Это очень простой пример. На самом деле, клиенту можно отправить гораздо большее количество данных с помощью метода response.write(), но вызывать его нужно перед методом response.end(). Я сохранил этот код в файл http.js и ввел в консоль:
Node http.js
Затем открыл браузер и перешел на http://localhost:8080. На странице отобразилось «Hello HTTP!».
Обработка url параметров
Как я уже упоминал ранее, мы все должны делать сами в Node.js, в том числе разбор аргументов запроса. Однако это не так уж и сложно. И в следующем примере я это продемонстрирую:
// Подключаем http модуль,
var http = require("http"),
// и url модуль, который поможет при разборе параметров запроса
url = require("url");
// Создаем сервер.
http.createServer(function (request, response) {
// Добавляем обработчик события.
request.on("end", function () {
// Разбираем запрос на аргументы и сохраняем их в переменную _get.
// Эта функция анализирует url и возвращает объект.
var _get = url.parse(request.url, true).query;
// Пишем заголовки в ответ.
response.writeHead(200, {
"Content-Type": "text/plain"
});
// Отправляем данные и завершаем ответ.
response.end("Here is your data: " + _get["data"]);
});
// Listen on the 8080 port.
}).listen(8080);
Этот код использует метод parse() модуля url, который является основным модулем в Node.js для преобразования url в объект. У возвращаемого объекта есть свойство query , которое извлекает url параметры. Я сохранил этот код в файл get.js и выполнил следующую команду:
Node get.js
Затем в браузере открыл страницу http://localhost:8080/?data=put_some_text_here.
Чтение и запись файлов
Для работы с файлами в Node.js существует модуль fs. У этого модуля есть методы fs.readFile() и fs.writeFile() для чтения и записи файлов. Я расскажу о них подробнее после знакомства с примером:
// Подключаем http модуль,
var http = require("http"),
// и модуль fs
fs = require("fs");
// Создаем http сервер.
http.createServer(function (request, response) {
// Добавляем обработчик события.
request.on("end", function () {
// Читаем файл
// Пишем заголовки.
response.writeHead(200, {
"Content-Type": "text/plain"
});
// Увеличиваем число полученное из файла.
data = parseInt(data) + 1;
// Пишем новое число в файл.
);
});
// Слушаем 8080 порт
}).listen(8080);
Я сохранил этот код в файл files.js. Перез запуском этого скрипта, нужно создать файл с именем test.txt в директории с files.js.
Этот код демонстирует работу методов fs.readFile() и fs.writeFile(). Каждый раз, когда сервер получает запрос, скрипт считывает число из файла, увеличивает его и записывает новое число в этот же файл.Метод fs.readFile() принимает 3 аргумента: имя файла для чтения, ожидаемую кодировку и вызываемую функцию.
Запись в файл гораздо проще. Не нужно ожидать каких-то результатов, хотя в реальном приложении нужно проверять на наличие ошибок. Метод fs.writeFile() принимает в качестве аргументов имя файла и данные для записи. Этот метод также может принимать 3-й и 4-й необязательные аргументы, для указания кодировки и функции обратного вызова.
Я запустил скрипт командой:
Node files.js
Затем открыл в браузере http://localhost:8080 и перезапустил несколько раз. Может показаться, что в коде была ошибка, т.к. число увеличилось на 2. Это не ошибка, потому что в действительности было послано 2 запроса. Первый запрос автоматически сделал браузер, когда запросил favicon.ico и вторым запросом был http://localhost:8080.
Хотя технически это не ошибка, такое поведение скрипта не очевидно. Поэтому я добавил исправление, которое проверяет url. Вот исправленный код:
// Подключаем http модуль,
var http = require("http"),
// и модуль fs
fs = require("fs");
// Создаем http сервер.
http.createServer(function (request, response) {
// Добавляем обработчик события.
request.on("end", function () {
// Проверяем запрос /
if (request.url == "/") {
// Читаем файл.
fs.readFile("test.txt", "utf-8", function (error, data) {
// Пишем заголовки.
response.writeHead(200, {
"Content-Type": "text/plain"
});
// Увеличивем число полученное из файла.
data = parseInt(data) + 1;
// Пишем увеличенное число в файл.
fs.writeFile("test.txt", data);
// Пишем симпатичное сообщение в ответ.
response.end("This page was refreshed " + data + " times!");
});
} else {
// Файл не найден
response.writeHead(404);
// и завершаем запрос без отправки каких-либо данных.
response.end();
}
});
// Слушаем 8080 порт.
}).listen(8080);
Теперь скрипт работает так, как ожидается.
Доступ к Mysql
Традиционные серверные технологии имеют встроенные средства подключения и отправки запросов к базе данных. Для Node.js нужно установить специальную библиотеку. Я выбрал наиболее стабильную и простую в использовании node-mysql. Полностью модуль назыается [email protected](после @ идет версия). Чтобы установить данный модуль, я открыл консоль, перешел в директорию, где хранятся скрипты и выполнил следующую команду:
Npm install [email protected]
Эта команда скачает и установит модуль, а также создаст папку node_modules в текущей директории. Далее я написал пример использования этого модуля:
// Подключаем http модуль,
var http = require("http"),
// и mysql модуль.
mysql = require("mysql");
// Создаем соединение.
// Настройки по умолчанию должны быть изменены в соответсвии с настройками mysql.
var connection = mysql.createConnection({
user: "root",
password: "",
database: "db_name"
});
// Создаем http сервер.
http.createServer(function (request, response) {
// Добавляем обработчик события.
request.on("end", function () {
// Запрос к базе данных.
connection.query("SELECT * FROM your_table;", function (error, rows, fields) {
response.writeHead(200, {
"Content-Type": "x-application/json"
});
// Отправляем данные в json формате.
// Строки переменной содержат результат запроса.
response.end(JSON.stringify(rows));
});
});
// Слушаем 8080 порт.
}).listen(8080);
Запрос к базе данных делается просто, нужно в методе query написать сам запрос и функцию обратного вызова. В реальном приложении, сначала нужно проверить были ли ошибки (параметр error будет undefined если были ошибки) и ответ зависит от того, выполнился ли запрос или нет. Также обратите внимание, что я установил Content-Type в x-application/json, оно указывает что MIME тип действительно является json. Параметр rows содержит результат запроса, который я легко конвертировал в JSON структуру ипользуя метод JSON.stringify().
Я сохранил этот код в файл mysql.js и выполнил команду:
Node mysql.js
Затем перешел в браузере на http://localhost:8080 и браузер предложил загрузить файл в JSON формате.
Заключение
Хоть в Node.js многое приходится делать вручную, все это окупается скоростью и надежностью приложений. Если вы не хотите разрабатывать приложения на низком уровне, то вы всегда можете использовать какой-нибудь фрэймворк для облегчения задачи. Например Express .
Node.js — это перспективная технология и отличный выбор для высоконагруженных приложений. Это было доказано такими корпорациями, как Microsoft, eBay и Yahoo. Если вы не уверены в выборе хостинга для вашего вебсайта или приложения, вы всегда можете использовать дешевое VPS решение или различные облачные сервисы, например Microsoft, Azure и Amazon EC2.
В узле вы можете установить глобальные переменные через объект «global» или «GLOBAL»:
GLOBAL._ = require("underscore"); // but you "shouldn"t" do this! (see note below)
или более полезно...
GLOBAL.window = GLOBAL; // like in the browser
Из источника узла вы можете видеть, что они псевдонимы друг другу:
Node-v0.6.6/src/node.js: 28: global = this; 128: global.GLOBAL = global;
В приведенном выше коде «это» - глобальный контекст. С помощью модуля commonJS (какой узел использует), этот «объект» внутри модуля (т. Е. «Ваш код») НЕ является глобальным контекстом. Для доказательства этого, см. Ниже, где я извергаю «этот» объект, а затем гигантский объект «GLOBAL».
Console.log("\nTHIS:"); console.log(this); console.log("\nGLOBAL:"); console.log(global); /* outputs ... THIS: {} GLOBAL: { ArrayBuffer: , Int8Array: { BYTES_PER_ELEMENT: 1 }, Uint8Array: { BYTES_PER_ELEMENT: 1 }, Int16Array: { BYTES_PER_ELEMENT: 2 }, Uint16Array: { BYTES_PER_ELEMENT: 2 }, Int32Array: { BYTES_PER_ELEMENT: 4 }, Uint32Array: { BYTES_PER_ELEMENT: 4 }, Float32Array: { BYTES_PER_ELEMENT: 4 }, Float64Array: { BYTES_PER_ELEMENT: 8 }, DataView: , global: , process: { EventEmitter: , title: "node", assert: , version: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule events", "NativeModule buffer", "Binding buffer", "NativeModule assert", "NativeModule util", "NativeModule path", "NativeModule module", "NativeModule fs", "Binding fs", "Binding constants", "NativeModule stream", "NativeModule console", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timers", "Binding timer_wrap", "NativeModule _linklist" ], versions: { node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" }, nextTick: , stdout: , arch: "x64", stderr: , platform: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: { TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", TERM: "xterm", SHELL: "/bin/bash", TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/launch-sD905b/Listeners", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "Default", SHLVL: "1", COLORFGBG: "7;0", HOME: "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin-js/external", _: "./index.js" }, openStdin: , exit: , pid: 10321, features: { debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls: true }, kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , removeListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask: , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , inherits: , _kill: , _byteLength: , mainModule: { id: ".", exports: {}, parent: null, filename: "/workspace/zd/zgap/darwin-js/index.js", loaded: false, exited: false, children: , paths: }, _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: }, GLOBAL: , root: , Buffer: { poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 }, setTimeout: , setInterval: , clearTimeout: , clearInterval: , console: , window: , navigator: {} } */
** Примечание: относительно установки «GLOBAL._», в общем случае вы должны просто выполнить var _ = require("underscore"); . Да, вы делаете это в каждом файле, который использует подчеркивание, точно так же, как в Java вы делаете import com.foo.bar; . Это упрощает определение того, что делает ваш код, потому что ссылки между файлами являются «явными». Мягко раздражает, но хорошо. .... Это проповедь.
Существует исключение для каждого правила. У меня был точно точно один экземпляр, где мне нужно было установить «GLOBAL._». Я создавал систему для определения файлов «config», которые были в основном JSON, но были «написаны в JS», чтобы немного повысить гибкость. В таких конфигурационных файлах не было инструкций «require», но я хотел, чтобы они имели доступ к подчеркиванию (система ENTIRE была основана на шаблонах подчеркивания и подчеркивания), поэтому перед оценкой «config» я бы установил «GLOBAL._». Так что да, для каждого правила есть где-то исключение. Но у вас есть хорошая причина, а не просто «я устал от ввода« требовать », поэтому я хочу нарушить соглашение».
В узле, вы можете установить глобальные переменные с помощью "глобальной" или "GLOBAL" объекта:
GLOBAL._ = require("underscore"); // but you "shouldn"t" do this! (see note below)
или полезнее...
GLOBAL.window = GLOBAL; // like in the browser
С узла, вы можете видеть, что они сшиты друг с другом:
Node-v0.6.6/src/node.js: 28: global = this; 128: global.GLOBAL = global;
В приведенном выше коде «это» является глобальным контекстом. С помощью модуля commonJS (какой узел использует), этот «объект» внутри модуля (т. Е. «Ваш код») НЕ является глобальным контекстом. Для доказательства этого, см. Ниже, где я извергаю «этот» объект, а затем гигантский объект «GLOBAL».
Console.log("\nTHIS:"); console.log(this); console.log("\nGLOBAL:"); console.log(global); /* outputs ... THIS: {} GLOBAL: { ArrayBuffer: , Int8Array: { BYTES_PER_ELEMENT: 1 }, Uint8Array: { BYTES_PER_ELEMENT: 1 }, Int16Array: { BYTES_PER_ELEMENT: 2 }, Uint16Array: { BYTES_PER_ELEMENT: 2 }, Int32Array: { BYTES_PER_ELEMENT: 4 }, Uint32Array: { BYTES_PER_ELEMENT: 4 }, Float32Array: { BYTES_PER_ELEMENT: 4 }, Float64Array: { BYTES_PER_ELEMENT: 8 }, DataView: , global: , process: { EventEmitter: , title: "node", assert: , version: "v0.6.5", _tickCallback: , moduleLoadList: [ "Binding evals", "Binding natives", "NativeModule events", "NativeModule buffer", "Binding buffer", "NativeModule assert", "NativeModule util", "NativeModule path", "NativeModule module", "NativeModule fs", "Binding fs", "Binding constants", "NativeModule stream", "NativeModule console", "Binding tty_wrap", "NativeModule tty", "NativeModule net", "NativeModule timers", "Binding timer_wrap", "NativeModule _linklist" ], versions: { node: "0.6.5", v8: "3.6.6.11", ares: "1.7.5-DEV", uv: "0.6", openssl: "0.9.8n" }, nextTick: , stdout: , arch: "x64", stderr: , platform: "darwin", argv: [ "node", "/workspace/zd/zgap/darwin-js/index.js" ], stdin: , env: { TERM_PROGRAM: "iTerm.app", "COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET": "/tmp/launch-nNl1vo/ServiceProcessSocket", TERM: "xterm", SHELL: "/bin/bash", TMPDIR: "/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/", Apple_PubSub_Socket_Render: "/tmp/launch-9Ga0PT/Render", USER: "ddopson", COMMAND_MODE: "unix2003", SSH_AUTH_SOCK: "/tmp/launch-sD905b/Listeners", __CF_USER_TEXT_ENCODING: "0x12D732E7:0:0", PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin", PWD: "/workspace/zd/zgap/darwin-js", LANG: "en_US.UTF-8", ITERM_PROFILE: "Default", SHLVL: "1", COLORFGBG: "7;0", HOME: "/Users/ddopson", ITERM_SESSION_ID: "w0t0p0", LOGNAME: "ddopson", DISPLAY: "/tmp/launch-l9RQXI/org.x:0", OLDPWD: "/workspace/zd/zgap/darwin-js/external", _: "./index.js" }, openStdin: , exit: , pid: 10321, features: { debug: false, uv: true, ipv6: true, tls_npn: false, tls_sni: true, tls: true }, kill: , execPath: "/usr/local/bin/node", addListener: , _needTickCallback: , on: , removeListener: , reallyExit: , chdir: , debug: , error: , cwd: , watchFile: , umask: , getuid: , unwatchFile: , mixin: , setuid: , setgid: , createChildProcess: , getgid: , inherits: , _kill: , _byteLength: , mainModule: { id: ".", exports: {}, parent: null, filename: "/workspace/zd/zgap/darwin-js/index.js", loaded: false, exited: false, children: , paths: }, _debugProcess: , dlopen: , uptime: , memoryUsage: , uvCounters: , binding: }, GLOBAL: , root: , Buffer: { poolSize: 8192, isBuffer: , byteLength: , _charsWritten: 8 }, setTimeout: , setInterval: , clearTimeout: , clearInterval: , console: , window: , navigator: {} } */
** Примечание: относительно настройки "GLOBAL._", в общем, вы должны просто сделать var _ = require("underscore"); . Да, вы делаете это в каждом файле, который использует подчеркивание, так же, как в Java вы делаете import com.foo.bar; . Это упрощает определение того, что делает ваш код, потому что ссылки между файлами являются «явными». Мягко раздражает, но хорошо. Это проповедь.
Существует исключение из каждого правила. У меня был точно точно один экземпляр, где мне нужно было установить «GLOBAL._». Я создавал систему для определения файлов «config», которые были в основном JSON, но были «написаны в JS», чтобы немного повысить гибкость. В таких конфигурационных файлах не было инструкций «require», но я хотел, чтобы они имели доступ к подчеркиванию (система ENTIRE была основана на шаблонах подчеркивания и подчеркивания), поэтому перед оценкой «config» я бы установил «GLOBAL._». Так что да, для каждого правила есть где-то исключение. Но у вас есть хорошая причина, а не просто «я устал от ввода», поэтому я хочу нарушить соглашение ».