KnexJS使用列数组:“未处理的拒绝错误:ER_BAD_FIELD_ERROR:未知列”

时间:2016-06-24 20:14:08

标签: mysql sql knex.js

我们在knex中使用了一系列列名:

    knex
        .select( ["rowid", "accountid", "accountname"] )
        .from("account")
        .then(function (e, rows) {
            callback(e, rows)
    })

并收到以下错误:

select `rowid,accountid,accountname` from `account`

Unhandled rejection Error: ER_BAD_FIELD_ERROR: Unknown column 'rowid,accountid,accountname' in 'field list'

显然,列名数组已转换为导致错误的字段字符串。使用单个字段可以正常工作:

    knex
        .select( "rowid", "accountid", "accountname" )
        .from('account')
        .then(function (e, rows) {
            callback(e, rows)
    })

这是一个已知问题吗?是否有使用'select'函数的数组的解决方法?

1 个答案:

答案 0 :(得分:1)

我使用knex 0.9.0进行了测试,它接受了select的数组参数而没有抱怨:

knex.
  select(['c1','t1','c2']).
  from('sample').
  then(function(rows) {
    console.dir(rows);
  });
// console.dir output:
// [ { c1: 22, t1: 'xx', c2: 33 },
//   { c1: 422, t1: 'xxxx', c2: 77 } ]

您可能已经注意到您的示例无论如何都有问题,then()不遵循常见的回调错误第一个样式(callback(error, result)),而是相反:then(success_callback, failure_callback),蓝鸟提供了便捷方法catch()以避免失败调用。因此,您可以将代码更改为:

knex
  .select( ["rowid", "accountid", "accountname"] )
  .from('account')
  .then(function (rows) {
    callback(null, rows)
  })
  .catch(function (e) {
    callback(e, null);
  });

如果您仍然使用不允许列名称数组的knex版本,则可以通过.apply()调用替换直接调用,例如:

knex
  .select.apply(knex, ["rowid", "accountid", "accountname"] )
  .from('account')
  .then(function (rows) {
    callback(null, rows)
  })
  .catch(function (e) {
    callback(e, null);
  });