Как получить доступ к объекту RowDataPacket
В настоящее время я разрабатываю настольное приложение с Node-webkit. Во время этого процесса мне нужно получить некоторые данные из локальной базы данных MySQL.
запрос работает нормально, но я не могу выяснить, как получить доступ к результатам. Я храню их все в массив, который передается в функцию. В консоли они выглядят так:
RowDataPacket {user_id: 101, ActionsPerformed: 20}
RowDataPacket {user_id: 102, ActionsPerformed: 110}
RowDataPacket {user_id: 104, ActionsPerformed: 3}
и вот структура запроса:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
for (var i of rows)
ret.push(i);
}
doStuffwithTheResult(ret);
}
как мне получить это в
7 ответов
оказывается, они нормальные объекты, и вы можете получить к ним доступ через user_id
.
Если результатом является массив, вам придется использовать [0].user_id
.
недавно я также столкнулся с той же проблемой, когда я использую waterline в express project для сложных запросов ,используйте инструкцию SQL для запроса.
Это мое решение: сначала преобразуйте возвращаемое значение (объект RowDataPacket) в строку, а затем преобразуйте эту строку в объект json.
следующий код :
//select all user (查询全部用户)
find: function(req, res, next){
console.log("i am in user find list");
var sql="select * from tb_user";
req.models.tb_user.query(sql,function(err, results) {
console.log('>> results: ', results );
var string=JSON.stringify(results);
console.log('>> string: ', string );
var json = JSON.parse(string);
console.log('>> json: ', json);
console.log('>> user.name: ', json[0].name);
req.list = json;
next();
});
}
следующая консоль:
>> results: [ RowDataPacket {
user_id: '2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5',
name: 'wuwanyu',
psw: '123',
school: 'Northeastern university',
major: 'Communication engineering',
points: '10',
datems: '1450514441486',
createdAt: Sat Dec 19 2015 16:42:31 GMT+0800 (中国标准时间),
updatedAt: Sat Dec 19 2015 16:42:31 GMT+0800 (中国标准时间),
ID: 3,
phone: 2147483647 } ]
>> string: [{"user_id":"2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5","name":"wuwanyu","psw":"123","school":"Northeastern university","major":"Communication engineering","points":"10","datems":"1450514
441486","createdAt":"2015-12-19T08:42:31.000Z","updatedAt":"2015-12-19T08:42:31.000Z","ID":3,"phone":2147483647}]
>> json: [ { user_id: '2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5',
name: 'wuwanyu',
psw: '123',
school: 'Northeastern university',
major: 'Communication engineering',
points: '10',
datems: '1450514441486',
createdAt: '2015-12-19T08:42:31.000Z',
updatedAt: '2015-12-19T08:42:31.000Z',
ID: 3,
phone: 2147483647 } ]
>> user.name: wuwanyu
попробуйте код, который дает JSON без rowdatapacket:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
ret = JSON.stringify(rows);
}
doStuffwithTheResult(ret);
}
Я нашел простой способ
Object.prototype.parseSqlResult = function () {
return JSON.parse(JSON.stringify(this[0]))
}
в БД слоя сделать парсинг как
let users= await util.knex.raw('select * from user')
return users.parseSqlResult()
это вернет элементы, как обычный массив JSON.
С Object.prototype
подход JSON.parse(JSON.stringify(rows))
возвращает объект, извлекает значения с помощью Object.values()
var resultArray = Object.values(JSON.parse(JSON.stringify(rows)))
использование:
resultArray.forEach(function(v){ console.log(v) })
уход от ответа Яна мелкого копирования объекта, еще одна чистая реализация с помощью функции карты,
высокий уровень того, что делает это решение: повторите все строки и скопируйте строки как допустимые объекты js.
// function will be used on every row returned by the query
const objectifyRawPacket = row => ({...row});
// iterate over all items and convert the raw packet row -> js object
const convertedResponse = results.map(objectifyRawPacket);
мы использовали функцию карты массива: она будет проходить через каждый элемент в массиве, использовать элемент в качестве входа в функцию и вставлять вывод функции в массив, который вы назначаете.
более конкретно функция objectifyRawPacket: каждый раз, когда она называется его видеть "{ RawDataPacket } " из исходного массива. Эти объекты действуют во многом как обычные объекты -"..."(spread) оператор копирует элементы из массива после периодов-по существу, копирует элементы в объект, в который он вызывается.
парены вокруг оператора распространения функции необходимы для неявного возврата объекта из функции стрелки.