Модули, о которых следует знать: optimist
Первый пост был о dnode — библиотеке для вызова удалённых процедур в свободном стиле.
На этот раз я представлю Вам node-optimist — лёгкий парсер аргументов командной строки. Эта библиотека также написана Джеймсом Хэллидэем (SubStack), одним из основателей Browserling и Testling.
Модули, о которых следует знать: dnode
Об авторе: Питер Круминс использует node.js больше двух лет, и построил на ней свой проект Browserling. Оригинальные статьи серии можно найти в его блоге.
В этой серии мы пройдемся по нескольким десяткам модулей для node.js, с примерами и объяснениями для чего какой модуль лучше применять.
Первый модуль в серии - dnode. Dnode это библиотека для удаленных вызовов в свободном стиле, она написана Джеймсом Хэллидэем (SubStack) - одним из основателей Browserling и Testling.
Хостинг Node.js на DuoStack
В полку node.js хостингов опять пополнение. В бой вступают свежие силы в лице Duostack и Nodester. Сегодня мы посмотрим поближе на первого кандидата
Как и многие другие node-хостинги, Duostack пока находится в режиме бета-тестирования. Доступ можно попросить на главной странице проекта, ключи высылаются сериями. Ждать вряд ли придётся долго.
Комбо-библиотека Do
При использовании асинхронных функций в Node.js программист часто сталкивается с однотипными задачами, красивое решение к которым на первый взгляд найти не очень просто. Несколько примеров:
- Ожидание нескольких событий сразу и выполнение функции по завершению всех событий (например, открытие нескольких соединений)
- Выполнение событий по цепочке, когда следующая функция использует результат работы предыдущей — это можно сделать стандартным способом, вкладывая функции друг в друга, но такой синтаксис быстро становится неуклюжим
- Применение асинхронного обработчика к массиву значений, с целью получения массива результатов
К счастью для нас, Github-пользователь creationix написал удобную библиотеку, которая умеет делать всё вышеперечисленное и кое что ещё.
Скачать Do можно с Github. Я не буду описывать установку, она не отличается от любого другого модуля для Node. Я просто рассмотрю её основные применения. Но сначала — пару слов о continuables.
Автоматическое управление багами в Github с помощью microcline
Для Node.js уже существует несколько модулей юнит-тестирования. И, так как большинство относящихся к Node вещей хостятся на Github, я решил быстренько реализовать Github API в виде модуля. В первую очередь это может понадобиться для того чтобы открывать/закрывать баги на Гитхабе прямо из юнит-тестов.
Безопасное выполнение стороннего кода в Node.js
Итак, следующий пункт после game loop — система скриптов. Понятное дело, это будет JavaScript. Но я хочу добиться большего — чтобы можно было исполнять сторонний код без боязни уронить всё приложение.
Вообще говоря Node падает довольно легко. Любая синтаксическая ошибка (в том числе в подключаемом модуле) или обращение к несуществующему методу — и всё, game over. Этого я и хочу избежать. Можно будет, например, сделать игру наподобие Habrawars (или даже на её основе), но проводящую бои между роботами участников автоматически, раз в час например. В HabraWars мне этого очень не хватало
Для безопасного выполнения кода у нас не так много вариантов. Eval, Evalcx, дочерний процесс.
Eval. Именно этим путём пошёл создатель Habrawars. Код выполняется в контролируемом окружении, ошибки в коде легко ловить. Минусы — коду доступен глобальный контекст, его конечно можно изолировать, но не то чтобы это было просто. В Habrawars например был не закрыт (и сейчас не закрыт, я полагаю)console.log— мелочь конечно, но можно пропустить и что нибудь посерьёзнее.Evalcx. Улучшенная версия eval, позволяющая задавать произвольный контекст выполняемому коду. Пришла в Node.js прямиком из Spidermonkey.- Дочерний процесс. Ничего не мешает нам запустить дочерний экземпляр node с нужным скриптом. Плюс: мы можем прибить дочерний процесс, если вдруг он решит войти в бесконечный цикл. Минус: дочернему процессу доступно очень много функций, в том числе запись в файлы и обращение в сеть. Впрочем, можно ограничить если не его функциональность, то хотя бы максимальный возможный ущерб — например, запустив его под пользователем с урезанными правами.
Т.к. eval, вообще говоря, выполняется в глобальном контексте и код внутри него имеет доступ к разным интересным штукам вплоть до сети и файловой системы, рассмотрим два оставшихся варианта по очереди. Давайте возьмём pulse.js из предыдущего примера, и используем интервальный таймер для организации game loop. Теперь нам надо создать NPC, который будет загружаться из другого файла (и не ронять основной цикл Pulse в случае ошибки в файле).
Node.js: использование Event Loop в качестве обычного цикла
Сегодня мы попробуем использовать Event Loop в качестве обычного цикла. К примеру, мы хотим сделать на NodeJS онлайн-игру, и нам нужен game loop, выполняющий определённые действия как можно чаще, и при этом не мешающий остальным обработчикам. Какие у нас есть варианты?
Вообще то event loop практически не доступен изнутри Node, он прозрачен для пользователя. Но для нашей задачи желательно выполнять определённое действие каждую итерацию этого цикла. При этом полностью блокировать цикл нельзя — Node не сможет общаться с внешним миром. Т.е. просто написать while(true) недостаточно.
Чтение и запись файлов в Node.js
Операции с файлами языку JavaScript не в новинку — в JScript, встроенном в Windows, доступен полный набор функций для работы с диском. Node, в силу своей асинхронной природы, несколько усложняет эти в общем то тривиальные задачи.
Сразу хочу предупредить об одной возможной ошибке. Если Вы, как и я, запускаете Node в виртуальной машине из общей папки, помните — VM в эту папку писать не может. Попытки создать или дополнить файлы в ней закончатся только
Error: Permission denied
Асинхронное программирование в Node.js: Ожидание нескольких событий сразу
Постановка задачи
Представим себе такую ситуацию. Нам надо сделать поиск в базе Tokyo Tyrant (или любой другой) и получить найденные значения в виде JavaScript-объектов. Проблема состоит в том, что получение объекта из Tokyo Tyrant происходит с коллбеком. Т.е., у нас на руках после поиска оказывается несколько коллбеков - по числу ожидаемых объектов:
Использование nginx вместе с Node.js
У Node.js есть один серьёзный недостаток — ей неудобно отдавать файлы. А без этой функции делать полноценный веб-сервис не очень то удобно. И если отдавать текстовые файлы вроде HTML/JavaScript/CSS ещё можно как то приспособиться, то с двоичными всё сложнее. Поэтому будем ставить nginx в пару к node.