为什么这个node-mysql插入会产生一个数组?

时间:2014-05-06 21:10:02

标签: javascript mysql node.js promise q

根据node-mysql documentation,将行插入带有auto_increment主键的表中的结果是一个对象,其中一个字段是insertId。但是,我在运行下面的代码时没有看到这一点。相反,我看到结果是一个双元素数组,其第一个元素是所需类型的对象,但其第二个元素是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)

1 个答案:

答案 0 :(得分:3)

带有三个参数的{p> node-mysql expects a callbackerr, 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)
    });