Node.js KnexJS RangeError:超过最大调用堆栈大小

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(

我在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.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查询都创建为单独的查询生成器实例,这些实例不共享状态