【问题标题】:mysql2 return value confusionmysql2返回值混淆
【发布时间】:2020-12-29 12:47:27
【问题描述】:

我对 mysql 和后端整体还是新手,所以如果这是一个愚蠢的问题,我很抱歉。

我正在使用 node/mysql2 来访问 mysql 数据库。 Promisified 连接池方法用于连接。当我尝试这段代码时:

    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 } ] ]

终端结果:

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

编辑:添加了结果截图以便于阅读

【问题讨论】:

    标签: javascript mysql node.js arrays object


    【解决方案1】:

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

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

    JavaScript 中有两种数据结构

    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] - 因为它只返回行。

    【讨论】:

    • 非常感谢!这对我帮助很大!
    【解决方案2】:

    由于 mysql2 与 mysql 完全不同,因为它返回一个承诺,如本文档:Here

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2013-07-11
      • 2015-10-27
      • 1970-01-01
      • 2017-05-22
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多