知海

Clojure:alumbra(GraphQL 组件集)

graphql-github-io-zh-Hans生态项目与库

Clojure:alumbra(GraphQL 组件集)

简介

alumbra 是一套可复用的 Clojure GraphQL 组件,遵循 alumbra.spec 所定义的数据结构。它提供了一种简洁、声明式的方式来构建 GraphQL 服务端,并可与 claro 等解析库无缝集成。

功能特性

  • 基于 Clojure 数据结构定义 GraphQL schema
  • 兼容 GraphQL 标准查询语法
  • 与 Claro 的 Resolvable 协议集成,方便实现字段解析
  • 可快速构建 HTTP 服务(示例中使用 Aleph)

安装依赖

project.cljdeps.edn 中添加 alumbra 依赖:

clojure 复制代码
[alumbra "0.3.11"]   ; 请以实际版本为准

同时需要引入示例中的 claroaleph

快速开始

以下示例展示如何使用 alumbra 创建一个简单的 GraphQL 服务。

1. 定义 Schema

使用 GraphQL SDL 字符串声明类型:

clojure 复制代码
(def schema
  "type Person { name: String!, friends: [Person!]! }
   type QueryRoot { person(id: ID!): Person, me: Person! }
   schema { query: QueryRoot }")

2. 实现解析逻辑

通过实现 data/Resolvable 协议来解析 Person 类型:

clojure 复制代码
(defrecord Person [id]
  data/Resolvable
  (resolve! [_ _]
    {:name    (str "Person #" id)
     :friends (map ->Person  (range (inc id) (+ id 3)))}))

定义根查询对象:

clojure 复制代码
(def QueryRoot
  {:person (map->Person {})
   :me     (map->Person {:id 0})})

3. 创建 HTTP 处理器

使用 alumbra 的 handler 函数生成应用处理器:

clojure 复制代码
(def app
  (alumbra/handler
    {:schema schema
     :query  QueryRoot}))

4. 启动服务

可以借助 Aleph 启动 HTTP 服务器:

clojure 复制代码
(defonce my-graphql-server
  (aleph.http/start-server #'app {:port 3000}))

5. 发起查询

服务启动后,通过 curl 发送 GraphQL 查询:

bash 复制代码
$ curl -XPOST "http://0:3000" -H'Content-Type: application/json' -d'{
  "query": "{ me { name, friends { name } } }"
}'

返回结果如下:

json 复制代码
{"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}}

相关项目

  • alumbra.spec:定义 alumbra 组件所依赖的数据结构规范
  • claro:Clojure 的解析库,用于处理字段级解析

总结

alumbra 提供了一套轻量、模块化的 GraphQL 工具,适合在 Clojure 生态中快速搭建类型安全、可组合的 GraphQL API。通过结合 Claro 等库,可以进一步简化数据解析流程。

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。