Node.js KnexJS RangeError:超过最大调用堆栈大小
我在nodejs中有以下knex查询。 此查询的目标是删除表Node.js KnexJS RangeError:超过最大调用堆栈大小,node.js,knex.js,Node.js,Knex.js,我在nodejs中有以下knex查询。 此查询的目标是删除表rule中的所有行,这些行在以下三个表中的任何一个表中都不是外键:rule\u set、rule\u in\u progress和rule\u pending。也就是说,删除规则中基本上未使用的所有行 deleteUnusedRules(txn) { const conn = txn ? txn : knex; return conn.table('rule').delete() .whereNotIn(
rule
中的所有行,这些行在以下三个表中的任何一个表中都不是外键:rule\u set
、rule\u in\u progress
和rule\u pending
。也就是说,删除规则
中基本上未使用的所有行
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
我在网上找不到任何解决办法 我想,因为您正在使用subquerybuilder
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'))
)
)
);
}
首先,所有union select查询都是作为单独的查询生成器实例创建的,这些实例没有共享状态。我想,因为您正在对所有union查询使用subquerybuilder
此
,所以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'))
)
)
);
}
最重要的是,所有union select查询都创建为单独的查询生成器实例,这些实例不共享状态