gpt4 book ai didi

node.js - KnexJS范围错误: Maximum call stack size exceeded

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:58 25 4
gpt4 key购买 nike

我在nodejs中有以下knex查询。此查询的目标是删除表 rule 中的所有行,这些行在以下三个表中都不是外键:rule_setrule_in_progressrule_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

我在网上找不到任何解决方案。

最佳答案

我想因为您正在使用子查询构建器 this 来执行所有联合查询,所以 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'))
)
)
);
}

所有联合选择查询都是作为单独的查询构建器实例创建的,它们不共享状态。

关于node.js - KnexJS范围错误: Maximum call stack size exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58629871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com