为什么这个node-mysql插入产生一个数组?
根据node-mysql 文档 ,向具有auto_increment主键的表中插入行的结果是一个对象,其中一个字段是insertId。 但是,我没有看到这在运行下面的代码。 相反,我看到结果是一个两个元素的数组,其第一个元素是所需types的对象,但其第二个元素是undefined
。 特别是,下面的代码打印:
[ { fieldCount: 0, affectedRows: 1, insertId: 12, serverStatus: 2, warningCount: 0, message: '', protocol41: true, changedRows: 0 }, undefined ]
任何人都可以解释文档和观察到的行为之间的差异吗?
码:
var mysql = require("mysql") var Q = require("q") var db = { "host": "localhost", "user": "root", "password": "xyz", "database": "study" } var pool = mysql.createPool(db); var getConnection = Q.nbind(pool.getConnection, pool) getConnection().then(function (connection) { Q.ninvoke(connection, 'query', "insert into tsheet (cname) values('reformation');") .then( function (rslt) { console.log(rslt) process.exit(0) }) }).done()
这里是表格:
mysql> describe tsheet; +-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | cid | int(11) | NO | PRI | NULL | auto_increment | | cname | varchar(256) | NO | | NULL | | +-------+--------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
node-mysql
需要一个有三个参数的callback函数: err, rows, fields
。 Q
将这些参数中的后两个参数放到一个数组中,所以只用一个参数就可以调用下一个函数。 ( err
在.catch
单独处理)。 由于这是一个INSERT,所以fields参数是未定义的。
如果要分别采用这两个参数,请使用.spread
:
Q.ninvoke(connection, 'query', "insert into tsheet (cname) values('reformation');") .spread( function (rslt, fields) { console.log(rslt) process.exit(0) });