Node.JS + MySQL

Mysql + Node.js

В последнем проекте появилась необходимость организации работы Node.JS с MySQL. Для создания данного взаимодействия существует несколько модулей, я решил использовать node-mysql, т.к. он предоставляет все необходимые мне функции.

Установка node-mysql

Для установки воспользуемся git:

cd ~/.node_libraries
git clone git://github.com/felixge/node-mysql.git mysql

После этого вы можете без проблем использовать данный модуль в вашей работе.

Установка соединения

Перед началом выполнения запросов к БД необходимо выполнить подключение к серверу MySQL. Рассмотрим как сделать это при помощи модуля node-mysql в node.js:

var Client = require('mysql').Client,
client = new Client();
client.user = 'root';
client.password = 'password';
client.connect();
client.end();

Первые две строки отвечают за подключение модуля и создания объекта-клиента. Далее задаются параметры аутентификации и вызывается метод connect. После этого если вы корректно указали пару логин-пароль, то будет установлено соединение. Последняя строка соответственно завершает соединение с сервером.

Отступление

Для того что-бы наш MySQL клиент мог передать данные аутентификации необходимо чтобы node.js был скомпилирован с поддержкой ssl, иначе при попытке установления соединения он будет жутко ругатся из-за то что не сможет зашифровать пароль. Для корректной компиляции node.js с поддержкой ssl в Debian вам потребуется пакет libssl-dev

Выполнение запросов

Сначала создадим тестовую базу данных и таблицу в ней:

CREATE DATABASE  `test_nodejs` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE test_nodejs;
CREATE TABLE  `test_nodejs`.`test` (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`some_text_data` VARCHAR( 255 ) NOT NULL ,
`some_date` DATE NOT NULL
) ENGINE = MYISAM ;

Теперь приступим непосредственно к выполнению запросов.

var Client = require('mysql').Client,
client = new Client();

client.user = 'root'; // Устанавливаем логин
client.password = 'password'; // Устанавливаем пароль
client.connect(); // Устанавливаем соединение
client.query('USE test_nodejs'); // Выполняем запрос на выбор БД
//  Запрос на вставку
client.query('INSERT INTO test VALUES (NULL, \'Test\', \'03-28-2011\')',function(){ 
    // Запрос на выборку
    client.query('SELECT * FROM test', function(error, result, fields){
        // Если возникла ошибка выбрасываем исключение
        if (error){
            throw error;
        }
        // выводим результат
        console.log(fields);
        console.log(result);
        // Завершаем соединение
        client.end();
    });
});

Для тех кто уже достаточно освоился в асинхронном программировании данный код не вызовет трудностей. Для выполнения запросов используется метод клиента query, который кроме самого запроса принимает callback-функцию с параметрами error (ошибка, если возникла), result (массив объектов результата запроса), fields (описание полей из множества полей результата). В результате выполнения вышеприведённого кода получим:

node test.js 
{ id: 
   { length: 45,
     received: 45,
     number: 2,
     type: 4,
     catalog: 'def',
     db: 'test_nodejs',
     table: 'test',
     originalTable: 'test',
     name: 'id',
     originalName: 'id',
     charsetNumber: 63,
     fieldLength: 20,
     fieldType: 8,
     flags: 16899,
     decimals: 0 },
  some_text_data: 
   { length: 69,
     received: 69,
     number: 3,
     type: 4,
     catalog: 'def',
     db: 'test_nodejs',
     table: 'test',
     originalTable: 'test',
     name: 'some_text_data',
     originalName: 'some_text_data',
     charsetNumber: 192,
     fieldLength: 765,
     fieldType: 253,
     flags: 4097,
     decimals: 0 },
  some_date: 
   { length: 59,
     received: 59,
     number: 4,
     type: 4,
     catalog: 'def',
     db: 'test_nodejs',
     table: 'test',
     originalTable: 'test',
     name: 'some_date',
     originalName: 'some_date',
     charsetNumber: 63,
     fieldLength: 10,
     fieldType: 10,
     flags: 4225,
     decimals: 0 } }
[ { id: 1,
    some_text_data: 'Test',
    some_date: Invalid Date } ]

На этом всё. Если есть какие-либо вопросы по данной теме, задавайте их в комментариях ниже, постараюсь ответить.