Node.JS
Comments 21
+3
было бы неплохо раскрыть: когда надо использовать синхронные вызовы, а когда — асинхронные. ЖС — прекрасен, и интересно, как будет правильно поступать с идеологической стороны.
0
Подробное освещение этого вопроса потянет на отдельный пост. Я думаю написать «полезный» пример использования через некоторое время.
Что касается идеологии, то думаю что это вне моей компетенции, я с JS работаю не больше года и сам ещё не привык.
+2
ну. я и не говорил о том, чтобы в этом сообщении. я предлагал в качестве мануала на сайте.
я имел ввиду идеологию использования mysql из node.js
+1
Всегда использовать асинхронные. Любой синхронный вызов уменьшает количество запросов (http-запросов от пользователей), которые может обработать скрипт.
+2
а зачем тогда синхронные?) у меня есть вот такой вот вопрос.
допустим, пользователь посылает мне аджаксом запрос на добавление сообщения, а я должен ему вернуть АйДишник добавленного сообщения или нуль, если произошла ошибка. будет ли работать следующий код, как я ожидаю?
asyncAddMsg(function (id) {
    sys.puts(id);
});

В том плане, что я делаю асинхронный вызов, а sys.puts(id); после того, как этот вызов совершится. Получит ли пользователь эти данные? Как сервер знает, когда заканчивать передачу данных? Он как-нибудь ждет завершения всех вызовов, а может какой-нибудь асинхронный вызов не совершится никогда?
+1
Сервер передаёт в обработчик запроса два объекта: request и response. У response есть метод end(), который и сообщает, что надо закончить передачу данных. Пока он не вызван, загрузка не закончится.

Ваш пример будет выглядеть приблизительно так

function(req, res) {
    asyncAddMsg(function(id) {
        res.writeHead(200);
        res.write(id);
        res.end();
    });
}


А сервер не останавливается даже если запросов нет, иначе кто на запросы отвечать будет.
+2
все, осилил, спасибо.

ээ… я вроде про остановку сервера не говорил ничего.
0
а зачем тогда синхронные?) у меня есть вот такой вот вопрос.

Потому что их реализовывать проще, как это не печально звучит. Потому в первую очередь я реализовал все функции в синхронном варианте, а потом уже была добавлена асинхронность к наиболее часто используемым: db.connect(), conn.query(), res.fetchAll(). Теоретически можно сделать асинхронные варианты практически всех функций, другое дело что они обычно используются один раз при инициализации приложения, а значит их можно оставить в синхронном варианте. Что касается списка функций, имеющих асинхронный вариант, то пока что хватает этого, но я всегда готов реализовать асинхронность и для других, если в этом будет необходимость.
+1
Честно говоря не видел предыдущих анонсов, но из этого абсолютно не могу врубится что это и для чего это?
+1
Вы правы, нужно было написать про Node.js, как и раньше. Надеюсь исправился.
Node-mysql-libmysqlclient добавляет поддержку работы с MySQL для Node.js, обеспечивает синхронное и асинхронное выполнение запросов к БД и имеющий API, близкое к API аналогичных коннекторов для PHP/Perl/Ruby и т.д.
+1
Не нашел API для nodejs на сайте. Примеры видел, но нужен список всех функций.

Поэтому вопросы
— Как установить клиентскую кодировку?
— Поддерживаются несколько запросов (через ;)?
— Поддерживаются несколько rowset'ов?
— Как забрать последний auto_increment?
+1
Методы для объектов в Javascript отличаются только строчной первой буквой. Т.е. метод MysqlConnection::AffectedRowsSync() превращается в conn.affectedRowsSync().
Dox ещё будет допиливаться, чтобы выдавать из C++ файлов актуальные для javascript имена функций.

Q: Как установить клиентскую кодировку?
A: conn.setCharsetSync().

Q: Поддерживаются несколько запросов (через ;)?
A: Да. Чтобы не перечислять все функции, сошлюсь на пример использования из тестов.
github.com/Sannis/node-mysql-libmysqlclient/blob/3b85703d97350a001d93c917ccaf8b0c56751d70/tests/simple/test-class-mysqlconnection.js#L30-64

Q: Поддерживаются несколько rowset'ов?
A: Я правильно понимаю, что речь идёт о результатах запросов вроде «SELECT 'a' as a, 'b' as b UNION SELECT 'c' as c»? Не пробовал, надо проверить.

Q: Как забрать последний auto_increment?
A: conn.affectedRowsSync().

P.S. Вас может смутить, что большинство функций присутствуют только в синхронном варианте. Это оттого, что они и используются в основном для инициализации. Что касается частоиспользуемых функций вроде lastInsertId(), то думаю в асинхронном режиме имеет смысл передавать в callback третьим параметром. К сожалению, пока ещё не рели, как будет лучше.
+1
Спасибо за ответы.
Пошел тестировать, но реально не хватает более удобного описание api. Список функций с параметрами который бы поместился на страницу было бы достаточно.
0
поддерживаю ArtemS.
Что касается частоиспользуемых функций вроде lastInsertId(), то думаю в асинхронном режиме имеет смысл передавать в callback третьим параметром

Имхо, отличное решение
+1
Пока старые грабли с SQL инжектами и т.д. не поперли, может сразу начнем писать DBAL или ORM?
0
Сейчас расширяю модуль в сторону prepared statements, уже работают вставки. Хотел сделать биндинг результата на переменные, но получится только обычный fetch, возвращающий строку. Это ещё предстоит написать. Наброски ORM можно посмотреть у одного из контрибьюторов: github.com/kreetitech/RDX. Подхватывайте, будем рады :-)
Only those users with full accounts are able to leave comments., please.