如何解决Apollo GraphQL自定义数据源集默认过滤器
对于Apollo GraphQL Server自定义数据源,向每个数据库查询添加默认where子句的最佳方法是什么?
where isDeleted = false
我使用Apollo GraphQL Server创建了一个自定义数据源。数据源只是从数据库中获取数据。
class CustomDataSource extends DataSource {
我扩展了CustomDataSource,以便可以将项目特定的详细信息添加到其中。也就是说,CustomDataSource应该是通用的,并且可以在各个项目之间重复使用,而MyProjectDataSource可以包含项目特定的业务规则。
class MyProjectDataSource extends CustomDataSource {
我的GraphQL查询接受一个过滤器参数,CustomDataSource将该过滤器应用于数据库查询。
type Query {
users(filter: JSON): [User]
}
我的customDataSource头很重,因此包含用于返回所有查询数据的联接。
实施思路
- MyProjectDataSource更改/覆盖过滤器参数,然后调用CustomDataSource。更改查询参数很简单,但是尚不清楚是否有可能(或建议)更改子字段参数。我正在使用npm模块graphql-parse-resolve-info进行字段前瞻。
async get(args,info) {
args.filter = 'where isDeleted = false'
return super.get(args,info);
}
-
MyProjectDataSource覆盖CustomDataSource函数。缺点:似乎过于复杂。也许公开一个可能会被覆盖的“ getFilter”功能是可行的,但是覆盖功能就像是大锤一样。
-
创建一个defaultFilter指令。缺点:架构复杂。需要在整个架构中手动添加。尚不清楚如何在MyProjectDataSource中实现,并且具有与上面2相同的实现缺点。
-
使用NodeJS eventEmitter允许CustomDataSource覆盖过滤器参数。缺点:必须为所有项目特定的规则添加到CustomDataSource的钩子。
// CustomDataSource to emit event (and pass filter argument).
eventEmitter.emit('filter',...
// MyDataSource to listen for event (and override filter argument).
eventEmitter.on('filter',...
解决方法
我找不到任何Apollo Server体系结构来帮助实现此功能。因此,我决定使用这种简化方法:
class CustomDataSource extends DataSource {
// Override this method in MyProjectDataSource (optional).
static onFilterEvent(args,info,eargs) {
return eargs;
}
// Add filter.
eargs = { filter: get(args,'filter') };
eargs = this.constructor.onFilterEvent(this.args,this.info,eargs);
if (eargs.filter) {
// Run database query with modified filter in eargs.filter.
}
}
class MyProjectDataSource extends CustomDataSource {
static onFilterEvent(args,eargs) {
eargs.filter = { isDeleted: false }; // TODO: If existing filter then use and clause.
return eargs;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。