Как получить доступ к объекту 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);
}

Как получить это в функции doStuffwithTheResult? Значения важнее, но если бы я мог получить ключи, это было бы здорово.

Ответы

Ответ 1

Оказывается, они являются обычными объектами, и вы можете получить к ним доступ через user_id.

На самом деле RowDataPacket - это имя функции конструктора, которая создает объект, это будет выглядеть так new RowDataPacket(user_id, ...). Вы можете проверить, открыв его имя [0].constructor.name

Если результатом является массив, вы должны использовать [0].user_id.

Ответ 2

Я также встретил ту же проблему в последнее время, когда я использую ватерлинию в экспресс-проекте для сложных запросов, используйте запрос 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

Ответ 3

Вы можете скопировать все перечисляемые собственные свойства объекта в новый с помощью Object.assign(target,... sources):

trivial_object = Object.assign({}, non_trivial_object);

так что в вашем сценарии этого должно быть достаточно, чтобы изменить

ret.push(i);

в

ret.push(Object.assign({}, i));

Ответ 4

При подходе 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) })

Ответ 5

вы пытаетесь использовать код, который дает JSON без rowdatapacket:

var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
    if (err)
        alert("...");
    else {
        ret = JSON.stringify(rows);
    }
    doStuffwithTheResult(ret);
}

Ответ 6

Я нашел простой способ

Object.prototype.parseSqlResult = function () {
    return JSON.parse(JSON.stringify(this[0]))
}

На уровне db разбор синтаксиса

let users= await util.knex.raw('select * from user')
    return users.parseSqlResult()

Это возвращает элементы как обычный массив JSON.

Ответ 7

Отклонение от ответа от jan о мелком копировании объекта, еще одна чистая реализация, использующая функцию карты,

Высокий уровень того, что делает это решение: переберите все строки и скопируйте строки как допустимые объекты 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}" из исходного массива. Эти объекты действуют во многом как обычные объекты - оператор "..." (распространение) копирует элементы из массива после периодов - по сути копируя элементы в вызываемый объект.

Парены вокруг оператора распространения в функции необходимы для неявного возврата объекта из функции стрелки.

Ответ 8

Более простой способ:

.then( resp=> {
  let resultFromDb= Object.values(resp)[0]
  console.log(resultFromDb)
}

В моем примере я получил объект в ответ. Когда я использую Object.values, у меня есть значение свойства в качестве ответа, однако оно входит в массив, используя [0] доступ к первому индексу этого массива, теперь у меня есть значение, чтобы использовать его там, где оно мне нужно.