后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载导读graphql-binding是一个用于构建 GraphQL Binding 的 npm 包它把「封装已有 GraphQL API」这件事简化成一次构造、按字段调用的模式让开发者可以把部分GraphQL API 变成可复用的 LEGO 积木模块嵌入自己的 GraphQL 服务器。读完本文你将掌握 Binding 的核心 APIquery/mutation/subscription、参数约定与完整示例并能理解这一设计思想在 Prisma 客户端Client.ts中的真实落地实现。GraphQL Binding 是什么把 API 变成可复用积木GraphQL Binding 是模块化构建块modular building blocks核心用途是将已有的 GraphQL API 嵌入到你自己的 GraphQL 服务器中。你可以把它理解为将部分的GraphQL API 转化为可复用的 LEGO 构建块——别人写好的查询能力你拿来即用拼进自己的 Schema 与 Resolver 体系。这种设计解决了 GraphQL 服务开发中的典型重复劳动问题当你的应用服务器需要访问另一个 GraphQL API比如 Prisma 数据库服务、GitHub API时与其手写完整查询字符串、自己管理 HTTP 发送逻辑不如通过 Binding 得到一组「按 Schema 根字段命名、开箱即用」的函数把 GraphQL 请求的构建与发送全部封装在底层。在 Prisma 生态中这一思想被进一步产品化prisma-binding即为 Prisma 服务专用的 Binding而仓库中 cli/packages/prisma-client-lib 的实现Client类正是这一思想的源码级体现本文后半部分会展开对照。安装yarn add graphql-binding安装后即可从包中引入Binding类const { Binding } require(graphql-binding)API 参考Binding 类constructorconstructor(options: BindingOptions): BindingBindingOptions具有以下属性KeyRequiredTypeDefault说明schemaYesGraphQLSchema-用于绑定binding的可执行 GraphQL schemafragmentReplacementsNoFragmentReplacements{}GraphQL fragment 定义列表指定 Resolver 正常运行所必需的字段beforeNo() void(() undefined)在向 GraphQL API 发送 query/mutation 之前执行的函数handlerNoanynull来自 JS Proxy 的handler对象subscriptionHandlerNoanynull用于订阅的处理函数其中schema必须是**可执行executable**的 schema——即已绑定 resolver 的完整 schema通常是graphql-tools的makeExecutableSchema的产物fragmentReplacements用于声明 Resolver 依赖但可能未被上层查询显式请求的字段保证委托请求不会缺字段before则适合注入鉴权、日志、请求计数等横切逻辑。query 与 mutationbinding.query.rootField: QueryMapany // 其中 rootField 是被绑定 GraphQL schema 中 Query 类型的某个根字段名 binding.mutation.rootField: QueryMapany // 其中 rootField 是被绑定 GraphQL schema 中 Mutation 类型的某个根字段名binding对象对外暴露两个用于向 API 发送查询与变更的属性binding.query与binding.mutation。二者都是QueryMap类型会按照被绑定 schema 的Query、Mutation根字段名自动暴露同名方法。从仓库中的类型定义可以看出这一契约的具体形状types.tsexport interface QueryMap { [rootField: string]: ( args?: { [key: string]: any }, context?: { [key: string]: any }, info?: GraphQLResolveInfo | string, ) Promiseany }这些自动生成的方法接收三个参数名称RequiredType说明argsNo[key: string]: any包含根字段参数的对象contextNo[key: string]: any沿 GraphQL Resolver 链下传的context对象每个 Resolver 都可以读写该对象infoNoGraphQLResolveInfo \| string沿 Resolver 链下传的info对象内含传入 query/mutation 的 AST或一个包含 selection set 的字符串info参数尤其关键传入GraphQLResolveInfo时Binding 会复用上层请求已声明的选择集selection set实现真正的Resolver 委托delegation不会多查或少查字段传入字符串时则直接指定要返回的字段例如{ id name }。示例假设存在如下 schematype Query { user(id: ID!): User } type Mutation { createUser(): User! }如果存在针对实现该 schema 的 GraphQL API 的binding就可以在实例上调用以下方法binding.query.user({ id: abc }) binding.mutation.createUser()在 Resolver 实现中使用 Binding 时可以这样委托findUser(parent, args, context, info) { return binding.query.user({ id: args.id }, context, info) } newUser(parent, args, context, info) { return binding.mutation.createUser({}, context, info) }注意原文档示例中的调用方式是binding.user(...)与binding.createUser(...)——新版本的 API 将委托方法组织在query/mutation命名空间下通过显式binding.query.user、binding.mutation.createUser的方式调用语义更清晰也更贴合QueryMap的类型定义。subscriptionbinding.subscription.rootField(...): AsyncIteratorany | PromiseAsyncIteratorany // 其中 rootField 是被绑定 GraphQL schema 中 Subscription 类型的某个根字段名binding.subscription与query、mutation遵循相同思路区别在于它不通过Promise返回单个值而是通过AsyncIterator返回值的流stream用于订阅实时事件。其类型为SubscriptionMaptypes.tsexport interface SubscriptionMap { [rootField: string]: ( args?: any, context?: { [key: string]: any }, info?: GraphQLResolveInfo | string, ) AsyncIteratorany | PromiseAsyncIteratorany }订阅方法同样接收args、context、info三个参数含义与query/mutation完全一致。完整最小示例下面是一个可运行的完整示例先用graphql-tools构造一个可执行 schema再基于它创建 Binding 并查询const { makeExecutableSchema } require(graphql-tools) const { Binding } require(graphql-binding) const users [ { name: Alice, }, { name: Bob, }, ] const typeDefs type Query { findUser(name: String!): User } type User { name: String! } const resolvers { Query: { findUser: (parent, { name }) users.find(u u.name name), }, } const schema makeExecutableSchema({ typeDefs, resolvers }) const findUserBinding new Binding({ schema, }) findUserBinding.query.findUser({ name: Bob }) .then(result console.log(result))执行后控制台将输出{ name: Bob }。这个例子演示了 Binding 的最简工作流makeExecutableSchema产出可执行 schema → 交给new Binding({ schema })→ 直接以方法调用的方式发送查询完全不需要手写查询字符串与 HTTP 层。源码纵深这一模式在 Prisma 客户端中的落地graphql-binding的设计思想在 Prisma 生态中被实现为 Prisma 专属的 Binding见姊妹篇文档 02-Prisma-Binding.md而仓库中的 prisma-client-lib 则提供了可对照的源码级实现。理解这部分有助于看清 Binding 背后「按 schema 生成调用入口 → 组装指令 → 构建查询 AST → 发送请求 → 解包结果」的完整链路。基于 schema 自动构建方法入口Client.ts 中的buildMethods展示了方法生成的入口buildMethods() { this._types this.getTypes() Object.assign(this, this._types.Query) Object.assign(this, this._types.Mutation) this.$subscribe this._types.Subscription }即从 schema 的 type map 出发把Query、Mutation类型的字段逐一变成客户端实例上的方法Subscription则挂载为$subscribe——这与binding.query/binding.mutation/binding.subscription的分组思路一脉相承。指令式调用链与延迟执行getTypesClient.ts为每个字段生成一个「累积指令」的函数每次调用都向_currentInstructions中推入一条Instruction记录fieldName、args、field、typeName等支持链式嵌套调用直到调用.then/.catchPromise 化见 Client.ts时才由processInstructions一次性把指令转换为 GraphQL 文档并执行Client.ts。这就是「先拼装查询、后统一发送」的委托式调用模型。查询文档的自动构建generateSelectionsClient.ts负责把指令还原成 GraphQL AST参数会被转换为变量定义variableDefinitions与变量值字段嵌套关系通过reduceRight反向组装如果最后一步是对象类型且没有显式选择集会自动补上__typename。整个流程的目标与 Binding 一致——调用方只声明「查哪个根字段、传什么参数」具体查询形状由库自动补齐。exists便捷的存在性判断buildExistsClient.ts展示了 Binding 之外的另一类便捷 API为每个模型类型生成exists.Type方法把where条件委托给对应的复数查询字段再判断结果长度是否大于 0返回boolean。这与 prisma-binding 文档中的prisma.exists.Post({ ... })用法完全对应。客户端类的工厂封装makePrismaClientClass.ts 进一步把这一模式封装为「由 typeDefs 生成客户端类」的工厂函数export function makePrismaClientClassT({ typeDefs, endpoint, secret, models, }): T { return class Client extends BaseClient { constructor(options: BaseClientOptions) { super({ typeDefs, endpoint, secret, models, ...options }) } } as any }它接受 schema 定义字符串typeDefs、服务地址endpoint、密钥secret与模型元信息models返回一个可直接实例化的客户端类——即「面向 Prisma 服务的 Binding 工厂」。公共 GraphQL bindings 与生态原文档还列出了两个生产环境中可直接参考的公开 Binding 示例graphql-binding-github面向 GitHub API与graphcool-binding面向 Graphcool/Prisma 服务。如果你基于本包创建了自己的 GraphQL Binding也可以通过 PR 补充到该列表中。关于 Binding 的问题与想法可以在 Prisma/Graphcool 社区中寻找#graphql-bindings相关讨论。小结GraphQL Binding 的核心价值在于消除 GraphQL 服务间协作的样板代码借助可执行 schemagraphql-binding自动生成与根字段一一对应的委托函数让查询、变更、订阅三种操作都以「函数调用 选择集」的简洁形态出现fragmentReplacements、before等选项则提供了字段补充与横切逻辑的扩展点。这一设计在 Prisma 客户端Client.ts、types.ts中得到完整落地可作深入学习与二次开发的参考范本。若你的项目基于 Prisma 服务构建 GraphQL 服务器可直接阅读 02-Prisma-Binding.md 获取 prisma-binding 的完整用法。赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐graphql-binding 实战指南将 GraphQL API 封装为可复用的模块化 Bindinggraphql binding 实战指南将 GraphQL API 封装为可复用的模块化 Binding graphql binding 是一个用于创建 Gr后端数据库GraphQLGraphQL Binding 指南使用 graphql-binding 将 GraphQL API 组合为可复用模块Prisma 生态实践GraphQL Binding 指南使用 graphql binding 将 GraphQL API 组合为可复用模块Prisma 生态实践 graphq后端数据库GraphQL用 graphql-binding 构建可复用的 GraphQL API 模块原理、API 与 Prisma 实践用 graphql binding 构建可复用的 GraphQL API 模块原理、API 与 Prisma 实践 GraphQL Binding 是一种将现后端数据库GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
双流浅层网络实现微表情识别 简介:本资源是一套面向人工智能初学者与计算机视觉实践者的微表情识别项目实战方案,聚焦于利用双流浅层网络实现高效、轻量的面部微表情识别,适用于情感计算、人机交互、安防心理评估等场景。压缩包共10个文件,含7个核心Python脚本… · 2026/9/23 21:34:08
用Python搭建网易新闻舆情热点分析平台的完整教程 简介:一套基于网易新闻与评论的舆情热点分析平台完整Python项目源码,面向Python初学者、课程设计及毕业设计学生。项目覆盖网络爬虫、数据清洗、中文分词、情感分析、关键词提取、时间序列分析与可视化展示等完整技术链路,前后端功能齐全&… · 2026/9/23 21:34:08
YOLOv8红细胞检测实战:标签格式转换与数据集划分全流程指南 简介:面向目标检测初学者与医学影像分析者,这份YOLO红细胞检测数据集涵盖1000张真实场景的高质量红细胞图片,采用LabelImg精细标注,并整理为VOC(xml)、COCO(json)、YOLO(txt)三类标准格式,分目录存放,可直接… · 2026/9/23 21:34:08
EMQX `$SYS` 保留消息过期机制:修复 StatefulSet 轮换后的陈旧节点标识问题 后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读
本文基于 EMQX 开源仓库的变更记录 fix-16715&… · 2026/9/23 23:00:18
Tyk Gateway 测试框架完全指南:从 TestCase 到端到端 HTTP 测试 API网关后端云原生 【免费下载链接】tyk Open Source API and AI Gateway supporting REST, GraphQL, TCP, gRPC and MCP (Model Context Protocol) 项目地址: https://gitcode.com/gh_mirrors/ty/tyk 点击查看 免费下载 Tyk 是一个开源 API 与 AI 网关,… · 2026/9/23 23:00:18
接口测试入门与实战:从工具到自动化框架 1. 接口测试入门:从零到上手的完整指南刚接触接口测试时,我也曾被各种专业术语和工具搞得晕头转向。直到参与了一个紧急项目,需要在3天内完成50个接口的测试覆盖,才真正掌握了这套高效的工作方法。现在我用最直白的语言࿰… · 2026/9/23 23:00:11
Octop:Python项目初始化CLI工具深度解析 1. 项目概述:Octop 是什么,它解决的到底是什么问题?Octop 这个名字乍一看容易让人联想到章鱼(octopus),但实际它是一个在 Python 开发者社区中悄然走红、却极少被中文技术媒体系统介绍的轻量级开发辅助工具… · 2026/9/23 23:00:11
OpenSpec规格先行:接口协作与自动化实践指南 1. 从“规格”说起:OpenSpec 到底在解决什么问题第一次听到 OpenSpec 这个名字,很多人会下意识地把它和“OpenAPI”“JSON Schema”这类东西归到一类,觉得无非又是一个接口描述格式。但真正在团队里推过接口规范、写过几百页接口文档、被前后… · 2026/9/23 23:00:05
25岁转行学AI来得及吗?长沙本地转行路径与参考 摘要本文针对 25 岁左右职场人群转行 AI 的普遍困惑,明确给出转行可行性结论,分析该年龄段转行的核心优势,结合长沙马栏山视频文创园、麓谷科技园等本地产业场景,梳理内容创作、技术开发两类适配的 AI 方向,给出阶段式… · 2026/9/23 22:59:59
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29