我对 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 中的数组是对象。
如果你愿意做 console.log(typeof [])
你也会反对。
JavaScript 中有两种数据结构
- 原始数据类型 = 未定义、 bool 值、数字、字符串等
- 结构类型 = Object、Array、Set 等。
参见: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
如果您想检查某物是否为数组,您必须使用 insanceof
或检查构造函数,但这是另一个答案的 Material 。基本上如果你在数组上做 typeof 你会得到对象。不要让你感到困惑。
所以结果实际上是一个数组。通过查看它,我们看到它包含两个数组
- 第一个数组包含实际数据
- 第二个数组包含列定义
文本 TextRow
和 ColumnDefinition
只是一个描述性文本,被注销以描述对象。您不能对文本本身执行任何操作,只能对对象执行任何操作。
所以.....如果您只需要包含数据的行,那么您只需获取结果数组中的第一个元素,如果您需要定义,则获取数组中的第二个元素
const rows = result[0]
const defs = result[1]
然后您可以循环遍历行(如果需要)
rows.forEach(item => {
console.log('id', item.id)
})
这就是为什么您的代码有 result[0] - 因为它只返回行。
关于javascript - mysql2返回值困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63839537/