不能将 bindNodeCallback 与 node-mysql connection.query 一起使用
Cannot use bindNodeCallback with node-mysql connection.query
我正在尝试使用 bindNodeCallback 将 connection.query
转换为 returns 可观察的函数。
const mysql = require('mysql2');
const { bindNodeCallback } = require("rxjs");
const connection = mysql.createConnection({host:"servername", user: "u", password:"p", database:"mydb" });
connection.connect();
let q = 'SELECT 1 from dual';
//1.This works. Default api
connection.query(q, (err, v)=>console.log(v));
//2.this throws: TypeError: Cannot read property 'config' of undefined
//bindNodeCallback(connection.query)(q).subscribe(v=>console.log(v));
//3.This returns a two dimensional array where the first element contains an array with the results and the second an array of ColumnDefinition.
bindNodeCallback(connection.query).call(connection, q).subscribe(v=>console.log(v));
语句 1 打印: [ TextRow { '1': 1 } ]
Statement 2 throws: TypeError: Cannot read property 'config' of undefined
在调试代码后我看到它引用了 this.config
(在 Connection 对象内部)根据 the doc调用输出函数时需要提供
所以我将 this
添加到语句 3 但由于某种原因我没有得到我期望的结果:
语句 3 打印: [[ TextRow { '1': 1 } ],[ColumnDefinition { _buf:..., _clientEncoding: 'utf-8'....]]
我的问题是,我应该如何使用bindNodeCallback()
打印语句1打印的结果?
注意:如果您想使用较旧版本的 mysql
测试此问题,您可以使用 mysql
而不是 mysql2
,在不同类型的情况下会出现相同的问题 TextRow
=>RowDataPacket
和 ColumnDefinition
=>FieldPacket
bindNodeCallback
将创建一个函数,该函数 returns 一个可观察对象,订阅后将流式传输一个且唯一包含以下值的值:
- 传递给回调的参数(如果有)
array
个传递给回调的参数(如果超过一个)。
mysql
和 mysql2
将两个参数传递给 query()
的回调:一个是包含结果的数组,另一个是包含列定义的数组。
验证调用 connection.query(q, (err, v, colDef)=>console.log(v, colDef));
以查看它还会打印列定义。
因为参数是两个,所以传递给 subscribe 的函数应该接收一个数组,而不是单个参数。
"我应该如何使用 bindNodeCallback()
打印语句 1 打印的结果?"
像现在一样调用它,只需从 map
传递以仅获取第一个参数(回调参数数组的索引 0 处的参数):
bindNodeCallback(connection.query).call(connection,q)
.pipe(map(arr=>arr[0])).subscribe(v=>console.log(v));
我正在尝试使用 bindNodeCallback 将 connection.query
转换为 returns 可观察的函数。
const mysql = require('mysql2');
const { bindNodeCallback } = require("rxjs");
const connection = mysql.createConnection({host:"servername", user: "u", password:"p", database:"mydb" });
connection.connect();
let q = 'SELECT 1 from dual';
//1.This works. Default api
connection.query(q, (err, v)=>console.log(v));
//2.this throws: TypeError: Cannot read property 'config' of undefined
//bindNodeCallback(connection.query)(q).subscribe(v=>console.log(v));
//3.This returns a two dimensional array where the first element contains an array with the results and the second an array of ColumnDefinition.
bindNodeCallback(connection.query).call(connection, q).subscribe(v=>console.log(v));
语句 1 打印: [ TextRow { '1': 1 } ]
Statement 2 throws: TypeError: Cannot read property 'config' of undefined
在调试代码后我看到它引用了 this.config
(在 Connection 对象内部)根据 the doc调用输出函数时需要提供
所以我将 this
添加到语句 3 但由于某种原因我没有得到我期望的结果:
语句 3 打印: [[ TextRow { '1': 1 } ],[ColumnDefinition { _buf:..., _clientEncoding: 'utf-8'....]]
我的问题是,我应该如何使用bindNodeCallback()
打印语句1打印的结果?
注意:如果您想使用较旧版本的 mysql
测试此问题,您可以使用 mysql
而不是 mysql2
,在不同类型的情况下会出现相同的问题 TextRow
=>RowDataPacket
和 ColumnDefinition
=>FieldPacket
bindNodeCallback
将创建一个函数,该函数 returns 一个可观察对象,订阅后将流式传输一个且唯一包含以下值的值:
- 传递给回调的参数(如果有)
array
个传递给回调的参数(如果超过一个)。
mysql
和 mysql2
将两个参数传递给 query()
的回调:一个是包含结果的数组,另一个是包含列定义的数组。
验证调用 connection.query(q, (err, v, colDef)=>console.log(v, colDef));
以查看它还会打印列定义。
因为参数是两个,所以传递给 subscribe 的函数应该接收一个数组,而不是单个参数。
"我应该如何使用 bindNodeCallback()
打印语句 1 打印的结果?"
像现在一样调用它,只需从 map
传递以仅获取第一个参数(回调参数数组的索引 0 处的参数):
bindNodeCallback(connection.query).call(connection,q)
.pipe(map(arr=>arr[0])).subscribe(v=>console.log(v));