【问题标题】:KNEX Undefined binding(s) detected when compiling UPDATE query编译 UPDATE 查询时检测到 KNEX 未定义的绑定
【发布时间】:2018-12-19 15:09:52
【问题描述】:

我正在使用 Knex 尝试更新 mySQL 表中的记录。我收到以下错误:

“UnhandledPromiseRejectionWarning:错误:编译更新查询时检测到未定义的绑定:更新购买集name = ?, email = ?, password = ?, purchase_id = ? 其中purchase_id = ?”

违规代码是:

const update = async data => {
  let purchase_id = data.purchaseId;
  let result = await knex("purchases")
    .where({ purchase_id })
    .update(data);
  return result;
};

让我感到困惑的是,错误中提到的所有字段(名称、电子邮件、密码和购买 ID)都是在我传递给 Knex 调用的 data 对象中定义的。这是data 在 Knex 调用之前记录的内容:

{ name: 'sdfs', 
  email: 'fds', 
  password: 'fds', 
  purchase_id: 39 }

我已经阅读了类似的问题(例如 KNEX Undefined binding(s) detected when compiling SELECT query ),但在这些情况下,问题似乎是未定义的变量正在传递给 KNEX,而对我来说似乎并非如此。

我可能做错了什么?

这是我的表格描述:

mysql> describe purchases;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| purchase_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| name          | varchar(100) | YES  |     | NULL    |                |
| email         | varchar(100) | YES  |     | NULL    |                |
| password      | varchar(100) | YES  |     | NULL    |                |
| address_1     | varchar(150) | YES  |     | NULL    |                |
| address_2     | varchar(150) | YES  |     | NULL    |                |
| city          | varchar(50)  | YES  |     | NULL    |                |
| state         | varchar(30)  | YES  |     | NULL    |                |
| zip_code      | varchar(15)  | YES  |     | NULL    |                |
| phone         | varchar(15)  | YES  |     | NULL    |                |
| cc_number     | int(11)      | YES  |     | NULL    |                |
| cc_expiration | varchar(10)  | YES  |     | NULL    |                |
| cc_cvv        | int(11)      | YES  |     | NULL    |                |
| billing_zip   | varchar(15)  | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
14 rows in set (0.06 sec)

【问题讨论】:

  • 我很确定问题出在此问题中未显示的代码中的其他地方。请显示.toSQL()knex("purchases") .where({ purchase_id }) .update(data).toSQL() 打印出来的内容,如果您可以添加完整的可运行示例代码,则很容易判断问题出在哪里。

标签: javascript node.js knex.js


【解决方案1】:

示例代码在data 属性中存在一些不一致。

let purchase_id = data.purchaseId;

上面您将骆驼案例 purchaseId 转换为蛇案例只是为了 .where() 语句,但随后您将 data 直接传递给 .update(data) 应该报告该列 purchaseId 未从数据库中找到。

您提到的绑定是undefided,而不是那个错误,这意味着您的问题在发送查询之前就已经发生了。

所以...在这种情况下,问题不在于显示的代码,而在于其他地方。请添加完整的示例如何执行并将参数传递给代码:

const update = async data => {
  let purchase_id = data.purchaseId;
  let result = await knex("purchases")
    .where({ purchase_id })
    .update(data);
  return result;
};

我会知道哪里出了问题。此外,如果您使用一些自定义的 wrapIndentifiers / postProcessResult 实现,则可能是失败的原因。

【讨论】:

  • 在我的客户端和服务器应用程序中转换为统一使用蛇盒解决了该问题。我很难弄清楚何时修复了未定义的绑定错误。在将所有内容转换为蛇案例的过程中,我开始收到您预期的错误(表中未找到purchaseId 字段)。在我开始转换之前,.toSQL() 导致了同样的未定义绑定错误。
猜你喜欢
  • 2017-12-15
  • 2019-06-18
  • 2017-12-04
  • 1970-01-01
  • 2020-05-30
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多