node.js - KnexJS RangeError:超出最大调用堆栈大小
问题描述
我在 nodejs 中有以下 knex 查询。此查询的目标是删除rule
三个表中任何一个不是外键的表中的所有行:rule_set
、rule_in_progress
和rule_pending
。也就是说,删除rule
基本上未使用的所有行。
deleteUnusedRules(txn) {
const conn = txn ? txn : knex;
return conn.table('rule').delete()
.whereNotIn('rule.id', function() {
this.table('rule_in_progress').select('rule_in_progress.rule_id')
.union(this.table('rule_pending').select('rule_pending.rule_id')
.union(this.table('rule_pending').select('rule_pending.rule_id')
.union(this.table('rule_set').select('rule_set.rule_id'))
)
);
});
}
但它会引发以下错误
stack=RangeError: Maximum call stack size exceeded
我在网上找不到任何解决方案。
解决方案
我想,因为您使用 subquerybuilderthis
进行所有联合查询,所以 knex 内部的某些东西会循环引用该查询......
基本上每次调用时,this.table
您都不是在创建新的子查询,而是在修改同一个构建器。
也许你试图这样做:
deleteUnusedRules(txn) {
const conn = txn ? txn : knex;
return conn.table('rule').delete()
.whereNotIn('rule.id', conn.table('rule_in_progress').select('rule_in_progress.rule_id')
.union(conn.table('rule_pending').select('rule_pending.rule_id')
.union(conn.table('rule_pending').select('rule_pending.rule_id')
.union(conn.table('rule_set').select('rule_set.rule_id'))
)
)
);
}
最重要的是,联合选择查询被创建为单独的查询构建器实例,它们不共享状态。
推荐阅读
- vba - 在文件夹中搜索时排除系统和打开的文件
- angular - 将输入数据绑定到模板中的 Angular 组件时,使用括号代替引号有什么作用?
- javascript - 轴改变旋转轴三个js
- javascript - 对话流:followEventInput
- java - Dropwizard 相当于 Spring 的 @Async
- docker - docker login 中的“保存凭据时出错”
- javascript - 在 TFS 仪表板小部件上使用 VSS 控件
- azure - Azure 资源在部署时找不到依赖关系
- sharepoint - 将 $.Deferred() 与嵌套的 $.each 语句一起使用
- java - 在 KafkaBolt 中暴露 Kafka 发布异常