用途:在 Elixir 的 Absinthe 框架中实现 GraphQL 解析器(resolver),提供可维护、避免 N+1 查询的实践指南。
主要能力:
- 基础解析器:以 list_users、get_user、create_user 等函数展示三参数签名(parent、args、resolution)与 {:ok, value} / {:error, reason} 返回约定。
- 解析上下文:从 resolution.context 读取 current_user,未认证时返回错误。
- Dataloader 集成:在 Schema 的 context/1 中创建 Dataloader 并添加 Dataloader.Ecto 数据源,在 plugins/0 中挂载 Absinthe.Middleware.Dataloader,字段上用 resolve dataloader(MyApp.Repo) 批量加载关联。
- 自定义数据源:通过 Dataloader.KV.new(&fetch/2) 实现按 user_ids 批量统计等自定义加载。
- 中间件:实现 Absinthe.Middleware 行为,在 call/2 中检查上下文并调用 Absinthe.Resolution.put_result 返回未授权错误,再通过 field 的 middleware 应用。
- 错误处理:用 Ecto.Changeset.traverse_errors 将 changeset 错误转换为可读消息。
最佳实践:使用 Dataloader 防止 N+1;解析器保持精简,业务逻辑委托给 context 模块;优雅处理错误并返回有意义信息;用中间件处理鉴权等横切关注点;对相关查询进行批处理。
反模式:不要在解析器中写业务逻辑;不要直接查询数据库;不要返回原始 Ecto changeset;不要跳过错误处理。
限制:资料未提供安装方式、版本要求、性能数据或收费信息。