如何访问RowDataPacket对象

问题描述 投票:40回答:8

我目前正在使用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函数中检索它?价值观更重要,但如果我能得到钥匙也会很棒。

mysql node.js node-webkit
8个回答
73
投票

原来它们是普通物体,你可以通过user_id访问它们。

如果结果是数组,则必须使用[0].user_id


19
投票

我最近也遇到了同样的问题,当我在express项目中使用waterline进行复杂查询时,使用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

9
投票

您可以通过Object.assign(target, ...sources)将对象的所有可枚举属性复制到新属性:

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

所以在你的场景中,它应该足以改变

ret.push(i);

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

5
投票

使用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) })

3
投票

你尝试没有rowdatapacket给出JSON的代码:

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

1
投票

我找到了一个简单的方法

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数组。


0
投票

离开jan的浅层复制对象的答案,使用map函数的另一个干净的实现,

此解决方案的高级别:迭代所有行并将行复制为有效的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}”。这些对象与普通对象非常相似 - “......”(扩展)操作符在句点之后从数组中复制项目 - 基本上将项目复制到它所调用的对象中。

函数上的扩展运算符周围的parens是从箭头函数隐式返回对象所必需的。


0
投票

更简单的方法:

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

在我的例子中,我收到了一个回复的对象。当我使用Object.values时,我将属性的值作为响应,但是它进入一个数组,使用[0]访问该数组的第一个索引,现在我有值在我需要的地方使用它。

© www.soinside.com 2019 - 2024. All rights reserved.