nodeJS Быстрый веб-сервер на javascript движке V8

12Янв/120

Модули, о которых следует знать: optimist

Первый пост был о dnode — библиотеке для вызова удалённых процедур в свободном стиле.

На этот раз я представлю Вам node-optimist — лёгкий парсер аргументов командной строки. Эта библиотека также написана Джеймсом Хэллидэем (SubStack), одним из основателей Browserling и Testling.

10Янв/120

Модули, о которых следует знать: dnode

Об авторе: Питер Круминс использует node.js больше двух лет, и построил на ней свой проект Browserling. Оригинальные статьи серии можно найти в его блоге.

В этой серии мы пройдемся по нескольким десяткам модулей для node.js, с примерами и объяснениями для чего какой модуль лучше применять.

Первый модуль в серии - dnode. Dnode это библиотека для удаленных вызовов в свободном стиле, она написана Джеймсом Хэллидэем (SubStack) - одним из основателей Browserling и Testling.

14Фев/111

Хостинг Node.js на DuoStack

В полку node.js хостингов опять пополнение. В бой вступают свежие силы в лице Duostack и Nodester. Сегодня мы посмотрим поближе на первого кандидата :)

Как и многие другие node-хостинги, Duostack пока находится в режиме бета-тестирования. Доступ можно попросить на главной странице проекта, ключи высылаются сериями. Ждать вряд ли придётся долго.

28Апр/100

Комбо-библиотека Do

При использовании асинхронных функций в Node.js программист часто сталкивается с однотипными задачами, красивое решение к которым на первый взгляд найти не очень просто. Несколько примеров:

  • Ожидание нескольких событий сразу и выполнение функции по завершению всех событий (например, открытие нескольких соединений)
  • Выполнение событий по цепочке, когда следующая функция использует результат работы предыдущей — это можно сделать стандартным способом, вкладывая функции друг в друга, но такой синтаксис быстро становится неуклюжим
  • Применение асинхронного обработчика к массиву значений, с целью получения массива результатов

К счастью для нас, Github-пользователь creationix написал удобную библиотеку, которая умеет делать всё вышеперечисленное и кое что ещё.

Скачать Do можно с Github. Я не буду описывать установку, она не отличается от любого другого модуля для Node. Я просто рассмотрю её основные применения. Но сначала — пару слов о continuables.

22Мар/100

Автоматическое управление багами в Github с помощью microcline

Для Node.js уже существует несколько модулей юнит-тестирования. И, так как большинство относящихся к Node вещей хостятся на Github, я решил быстренько реализовать Github API в виде модуля. В первую очередь это может понадобиться для того чтобы открывать/закрывать баги на Гитхабе прямо из юнит-тестов.

22Мар/101

Безопасное выполнение стороннего кода в 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 в случае ошибки в файле).

Метки записи: Читать полностью
22Мар/103

Node.js: использование Event Loop в качестве обычного цикла

Сегодня мы попробуем использовать Event Loop в качестве обычного цикла. К примеру, мы хотим сделать на NodeJS онлайн-игру, и нам нужен game loop, выполняющий определённые действия как можно чаще, и при этом не мешающий остальным обработчикам. Какие у нас есть варианты?

Вообще то event loop практически не доступен изнутри Node, он прозрачен для пользователя. Но для нашей задачи желательно выполнять определённое действие каждую итерацию этого цикла. При этом полностью блокировать цикл нельзя — Node не сможет общаться с внешним миром. Т.е. просто написать while(true) недостаточно.

Метки записи: Читать полностью
22Мар/100

Чтение и запись файлов в Node.js

Операции с файлами языку JavaScript не в новинку — в JScript, встроенном в Windows, доступен полный набор функций для работы с диском. Node, в силу своей асинхронной природы, несколько усложняет эти в общем то тривиальные задачи.

Сразу хочу предупредить об одной возможной ошибке. Если Вы, как и я, запускаете Node в виртуальной машине из общей папки, помните — VM в эту папку писать не может. Попытки создать или дополнить файлы в ней закончатся только Error: Permission denied

Метки записи: Читать полностью
5Фев/105

Асинхронное программирование в Node.js: Ожидание нескольких событий сразу

Постановка задачи

Представим себе такую ситуацию. Нам надо сделать поиск в базе Tokyo Tyrant (или любой другой) и получить найденные значения в виде JavaScript-объектов. Проблема состоит в том, что получение объекта из Tokyo Tyrant происходит с коллбеком. Т.е., у нас на руках после поиска оказывается несколько коллбеков - по числу ожидаемых объектов:

Метки записи: Читать полностью
20Янв/100

Использование nginx вместе с Node.js

У Node.js есть один серьёзный недостаток — ей неудобно отдавать файлы. А без этой функции делать полноценный веб-сервис не очень то удобно. И если отдавать текстовые файлы вроде HTML/JavaScript/CSS ещё можно как то приспособиться, то с двоичными всё сложнее. Поэтому будем ставить nginx в пару к node.