如何访问RowDataPacket对象

时间:2015-07-04 14:53:13

标签: mysql node.js node-webkit

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

14 个答案:

答案 0 :(得分:68)

原来它们是普通对象,您可以通过user_id访问它们。

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

答案 1 :(得分: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

答案 2 :(得分:8)

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

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

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

ret.push(i);

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

答案 3 :(得分:6)

嗨,尝试一下100%可行的方法:

results=JSON.parse(JSON.stringify(results))
doStuffwithTheResult(results); 

答案 4 :(得分: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) })

答案 5 :(得分:2)

您尝试使用JSON而不使用rowdatapacket的代码:

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

答案 6 :(得分: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数组返回。

答案 7 :(得分: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}”。这些对象的行为与普通对象非常相似-“ ...”(传播)运算符在句点之后从数组中复制项目-本质上是将项目复制到被调用的对象中。

该函数中散布运算符周围的括号对于从箭头函数隐式返回对象是必需的。

答案 8 :(得分:0)

更简单的方法:

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

在我的示例中,我收到了一个对象作为回应。 当我使用Object.values时,我具有该属性的值作为响应,但是它位于数组内部,使用[0]访问该数组的第一个索引,现在我有了在需要的地方使用它的值。 / p>

答案 9 :(得分:0)

我真的不知道这有什么大不了,我的意思是看看运行CALL ps_get_roles();的sp是否有效。 是的,我从数据库和其他方面得到了一个丑陋的屁股回应。这是哪个:


[
  [
    RowDataPacket {
      id: 1,
      role: 'Admin',
      created_at: '2019-12-19 16:03:46'
    },
    RowDataPacket {
      id: 2,
      role: 'Recruiter',
      created_at: '2019-12-19 16:03:46'
    },
    RowDataPacket {
      id: 3,
      role: 'Regular',
      created_at: '2019-12-19 16:03:46'
    }
  ],
  OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 35,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0
  }
]

它是一个看起来像这样的数组:


rows[0] = [
    RowDataPacket {/* them table rows*/ },
    RowDataPacket { },
    RowDataPacket { }
];

rows[1] = OkPacket {
   /* them props */
}

但是如果我在客户端执行http response来索引[0]行的行,我会得到:

[
  {"id":1,"role":"Admin","created_at":"2019-12-19 16:03:46"}, 
  {"id":2,"role":"Recruiter","created_at":"2019-12-19 16:03:46"},
  {"id":3,"role":"Regular","created_at":"2019-12-19 16:03:46"}
]

我不需要做任何事情

rows[0].map(row => {
   return console.log("row: ", {...row});
});

输出结果如下:

row:  { id: 1, role: 'Admin', created_at: '2019-12-19 16:03:46' }
row:  { id: 2, role: 'Recruiter', created_at: '2019-12-19 16:03:46' }
row:  { id: 3, role: 'Regular', created_at: '2019-12-19 16:03:46' }

因此,所有人无缘无故跳闸。也可能是因为我在运行存储过程而不是常规查询,查询和sp的响应不相同。

答案 10 :(得分:0)

解决方案

只需执行:JSON.stringify(results)

答案 11 :(得分:0)

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);

const GITHUB_ISSUE = `gh8169`;
const connectionString = `mongodb://localhost:27017/${ GITHUB_ISSUE }`;
const { Schema } = mongoose;

run().then(() => console.log('done')).catch(error => console.error(error.stack));

async function run() {
  console.log('Mongoose version:', mongoose.version);
  mongoose.set('useUnifiedTopology', true);
  mongoose.set('useNewUrlParser', true);
  mongoose.connect(connectionString, { useFindAndModify: false });
  const db = mongoose.connection;
  
  db.once('open', () => console.log('connected'));
} 

答案 12 :(得分:0)

如果有人需要从多个查询中检索特定的RowDataPacket对象,就在这里。

开始之前

重要:确保您在mysql连接中启用multipleStatements,如下所示:

// Connection to MySQL
var db = mysql.createConnection({
  host:     'localhost',
  user:     'root',
  password: '123',
  database: 'TEST',
  multipleStatements: true
});

多个查询

假设我们有多个查询正在运行:

  // All Queries are here
  const lastCheckedQuery = `
    -- Query 1
    SELECT * FROM table1
    ;

    -- Query 2
    SELECT * FROM table2;
    `
    ;

  // Run the query
  db.query(lastCheckedQuery, (error, result) => {
    if(error) {
      // Show error
      return res.status(500).send("Unexpected database error");
    }

如果我们console.log(result),您将获得以下输出:

[
  [
    RowDataPacket {
      id: 1,
      ColumnFromTable1: 'a',
    }
  ],
  [
    RowDataPacket {
      id: 1,
      ColumnFromTable2: 'b',
    }
  ]
]

两个表都显示两个结果。

这里是基本Javascript数组的放置位置https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

我们要从table1和名为ColumnFromTable1的列中获取数据

result[0][0].ColumnFromTable1 // Notice the double [0]

得出a的结果。

答案 13 :(得分:-1)

当尝试使用存储过程返回的值时遇到了这个问题。

console.log(result[0]);

将输出“ [RowDataPacket {datetime:'2019-11-15 16:37:05'}]”。

我发现

console.log(results[0][0].datetime);

给我我想要的价值。