mysql2返回值混乱

问题描述

我仍然对MysqL和后端总体还是陌生的,如果这是一个愚蠢的问题,我感到抱歉。

我正在使用node / MysqL2访问MysqL DB。承诺的连接池方法用于连接。当我尝试此代码时:

    const result = await db.query(
        `
        SELECT
            id
        FROM
            User
        WHERE
            name = ?
        
        `,[name]
    );
    return result[0];

返回值是这个数组 [ [ TextRow { id: 53 } ],[ ColumnDeFinition { _buf: <Buffer 01 00 00 01 01 28 00 00 02 03 64 65 66 06 64 65 76 69 6c 7a 04 55 73 65 72 04 55 73 65 72 02 69 64 02 69 64 0c 3f 00 0b 00 00 00 03 0b 42 00 00 00 05 ... 24 more bytes>,_clientEncoding: 'utf8',_catalogLength: 3,_catalogStart: 10,_schemaLength: 6,_schemaStart: 14,_tableLength: 4,_tableStart: 21,_orgTableLength: 4,_orgTableStart: 26,_orgNameLength: 2,_orgNameStart: 34,characterSet: 63,encoding: 'binary',name: 'id',columnLength: 11,columnType: 3,flags: 16907,decimals: 0 } ] ]

终端上的结果:

enter image description here

但实际上它是一个对象。因为console.log('result is ',typeof result)向我展示了一个对象。 这是使我困惑的第一件事。为什么console.log显示对象类型,但是其返回值是数组? 另一件事是,当我尝试访问 TextRow 时,我根本无法访问。 TextRow在做什么?这也让我很困惑。如果有人可以帮助我澄清这一点,我将不胜感激

编辑添加了结果截图以更好地阅读

解决方法

由于mysql2与mysql完全不同,因为它以以下文档形式返回承诺:Here

所以我这样编辑了您的代码,希望它对您有用:

const [rows]= await db.query(
    `
    SELECT
        id
    FROM
        User
    WHERE
        name = ?
    
    `,[name]
);
return rows.map((row) => { return row.id  };
,

首先。 JavaScript中的数组是对象。

如果您愿意console.log(typeof []),您也会反对。

JavaScript中有2种数据结构

  1. 原始数据类型=未定义,布尔值,数字,字符串等
  2. 结构类型=对象,数组,集合等

请参阅: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

如果要检查某物是否为数组,则必须使用insanceof或检查构造函数,但这对于另一个答案很重要。基本上,如果对数组执行typeof,则将获得对象。别让那让您感到困惑。

所以结果实际上是一个数组。通过查看它,我们看到它包含两个数组

  1. 第一个数组包含实际数据
  2. 第二个数组包含列定义

文本TextRowColumnDefinition只是描述性文本,已注销以描述对象。您不能对文本本身做任何事情,只能对对象做任何事情。

所以.....如果只希望包含数据的行,那么只需要获取结果数组中的第一个元素,如果想要定义,则只需获取数组中的第二个元素

const rows = result[0]
const defs = result[1]

然后,您可以根据需要循环浏览

rows.forEach(item => {
 console.log('id',item.id)
})

这就是为什么您的代码具有result [0]的原因-因为它只返回行。