为什么这个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, fieldsQ将这些参数中的后两个参数放到一个数组中,所以只用一个参数就可以调用下一个函数。 ( 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) });