2013-12-26 4 views
1

Я только начал использовать node.js и node-mysql, и я столкнулся со следующей проблемой: Я отправляю данные от клиента (Angular.js). Сервер (node.js) отправляет его в базу данных mysql. Server.js (часть):Кодировка в node-mysql

var express = require('express'); 
var app  = express(); 
mysql = require('node-mysql2'); 
var connection = mysql.createConnection(someSettings); 
...skipped part... 
app.put('/api/announcements', function(req, res) { 
    connection.execute('INSERT INTO announcements(title, text) VALUES(?, ?)', [req.body.title, req.body.text]); 
    res.send({status: true}); 
}); 

вещь, если я посылаю латинские буквы полей запроса title и text, это нормально. Но если я пытаюсь отправить кириллицы те, появляется следующий вопрос:

app.put('/api/announcements', function(req, res) { 
    console.log(req.body.title, req.body.text); // <- shows the whole strings 
    ... 

, но в таблице есть только часть строки! (Я имею в виду, поля title и text новой записи состоят только часть строки

Скриншоты объяснить:. first query (console.log result) second query phpMyAdmin

UPD: вот пример, чтобы вы могли попробовать его самостоятельно. В архиве находится файл экспорта таблицы (announcements.sql) и папка www для проекта cordova. Вам также понадобятся плагины: экспресс, mysql2, обещание, nodejs-websocket. Идея состоит в том, что я запускаю 2 сервера: на 88 портах для обработки REST запросов и на 89 для трансляции изменений для всех подключенных клиентов. Попробуйте выполнить следующий тест: откройте страницу индекса в броке wser и попытайтесь добавить эти строки: 1. Есть место, где заканчивается тротуар 2. Есть место, где заканчивается тротуар; sqlfiddle.com/#!2/96085/1 db.tt/GfvjmXtU

+0

Ваше сообщение недостаточно ясно, чтобы понять, что вы имеете в виду; есть ли ошибка? Я не знаю русский, это русский неправильно? На вторичной ноте что-то, что, безусловно, стоит сделать, - это прекратить использование библиотеки, специфичной для mysq, и вместо этого использовать нечто вроде библиотеки «sequelize», чтобы вы не выдавали «sql-запросы», а просто запрашивали записи, совместимые с моделью, быть написанным и прочитанным. –

+0

Да, есть ошибка, потому что в базу данных записывается только половина строки. Что касается продолжения, спасибо за совет, я попробую. Но меня беспокоит одно: я могу ошибаться, но разве он не использует модуль node-mysql? Если это так, может быть одна и та же проблема –

+0

разница в том, как вы называете sequelize; вы не говорите ему, что выполняете SQL-инструкции, вы просто манипулируете записями в объекте, а sequelize заботится о том, чтобы убедиться, что ваш SQL-сервер обновлен соответствующим образом. Что касается ошибки: можете ли вы показать, что вы ожидаете увидеть, что вы видите вместо этого, и каковы данные в вашей таблице SQL? –

ответ

0

Я понял, что эта ошибка появляется только в том случае, если я использую connection.execute(). connection.query() работает отлично. Я еще не раскапывать причины такого поведения, но разница:

Если я использую

connection.query('INSERT INTO announcements VALUES("Расти борода, расти")'); 

Query.toPacket (/node_modules/mysql2/lib/packets/query.js) возвращает

{ 
    sequenceId: 0, 
    buffer: <Buffer 04 00 00 00 03 49 ...>, 
    offset: 83, 
    start: 0, 
    end: 83 
} 

И

connection.execute('INSERT INTO announcements VALUES("Расти борода, расти")'); 

Execute.toPacket (/node_modules/mysql2/lib/packets/execute.js) возвращает

{ 
    sequenceId: 0, 
    buffer: <Buffer 88 07 5d 01 17 02 ...>, 
    offset: 38, 
    start: 0, 
    end: 54 
}