微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apollo GraphQL自定义数据源集默认过滤器

如何解决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头很重,因此包含用于返回所有查询数据的联接。

实施思路

  1. MyProjectDataSource更改/覆盖过滤器参数,然后调用CustomDataSource。更改查询参数很简单,但是尚不清楚是否有可能(或建议)更改子字段参数。我正在使用npm模块graphql-parse-resolve-info进行字段前瞻。
async get(args,info) {
  args.filter = 'where isDeleted = false'
  return super.get(args,info);
}
  1. MyProjectDataSource覆盖CustomDataSource函数。缺点:似乎过于复杂。也许公开一个可能会被覆盖的“ getFilter”功能是可行的,但是覆盖功能就像是大锤一样。

  2. 添加一个新的defaultFilter参数。缺点:我们不想将此参数公开给应用程序。

  3. 创建一个defaultFilter指令。缺点:架构复杂。需要在整个架构中手动添加。尚不清楚如何在MyProjectDataSource中实现,并且具有与上面2相同的实现缺点。

  4. 使用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',...
  1. 创建一个自定义过滤器数据类型(而不是JSON类型)。也许此过滤器类可以公开defaultFilter属性。缺点:感觉像添加简单需求的复杂道路。

解决方法

我找不到任何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 举报,一经查实,本站将立刻删除。