使用GraphQL将请求直接转发给Prisma(附录OpenCRUD说明)
使用prisma-binding的forwardTo功能
在GraphQL服务器的解析器中,将forwardTo直接赋值给每个查询。
参数是在以后的GraphQL服务器上下文中指向Prisma的端点名称。
(在下面的例子中为prisma)
import { GraphQLServer } from 'graphql-yoga'
import { Prisma, forwardTo } from 'prisma-binding'
const resolvers = <any> {
Query: {
user: forwardTo('prisma'),
users: forwardTo('prisma')
},
Mutation: {
createUser: forwardTo('prisma')
}
}
const server = new GraphQLServer({
typeDefs: 'src/generated/app.graphql',
resolvers,
context: req => ({
...req,
prisma: new Prisma({
typeDefs: 'src/generated/prisma.graphql',
endpoint: 'http://PRISMA_HOST',
}),
}),
})
server.start({ port: 4010,}, ({port}) => console.log(`GraphQL server is running on http://localhost:${port}`))
注意:不好意思,这里使用了来逃避对于typescript的类型指定。
执行结果如下,可以正确查询到名为”users”的表。

如果您想对查询参数或返回值进行轻微修改,可以在解析器内部进行自定义实现。
使用prisma-binding实现自定义查询的方法。
附件:Prisma所提供的API,即OpenCRUD。
实际上,这可能是最重要的地方。
OpenCRUD是基于GraphQL的SDL,专门用于数据提取和更新。以下是其含义。
GraphQL在生产环境中的局限性
GraphQL是一种API格式。除了以JSON格式发送查询并以JSON格式返回响应之外,它并没有规定任何内容。
因此,有利有弊。
-
- いいところ: 自由にアプリでAPIの形式を決めてしまえるため、API開発者は楽です。
- 悪いところ: サービスやアプリごとにいろいろAPIが変わるので、API利用者は学習コストが高くなることです。
这是常见的权衡。
OpenCRUD的方針:在GraphQL上加入限制。
OpenCRUD旨在通过将目标限定为“用于数据获取和更新的API”,并对API进行限制,以便稍微减轻API使用者的负担。
在数据提取和更新中, 我们会想到 SQL 这个查询语言作为事实,但 OpenCRUD 在 GraphQL 上实现了 SQL 语句的原语,我认为也可以这样说。它的氛围类似于混合了 SQL 和 MongoDB 查询的感觉。让我们来比较一下。
select * from users
{ users {}}
db.users.find({})
where a = 'value'
where: { a: 'value' }
{ a: "value" }
where a in ('value1', 'value2')
where { a_in: ['value1', 'value2'] }
{ a: { $in: [ "value1", "value2" ] } }
where a not in ('value1', 'value2')
where { a_not_in: ['value1', 'value2'] }
{ a: { $nin: [ "value1", "value2" ] } }
where a = 'aval' AND b = 'bval'
where: {OR: [ { a: "aval" }, { b: "bval" }]}
{ $or: [ { a: "aval" }, { b: "bval" } ] }
迄今为止,Web API的查询方式的规范只有REST,但是REST的限制太严格,表现力不足。
GraphQL增加了灵活性,但是灵活性过于高,因此出现了定义了类似于SQL的查询方式规范的OpenCRUD。
对于精通使用SQL的人来说,可能会觉得”SQL已经存在了,为什么还需要其他的?”不过,在这里有一种与以往不同的思维方式。
Prisma的官方页面上提出了以下类似的建议。
-
- フロント寄りのAPI(自由度の低いクエリ)からバックエンド寄りのAPI(自由度の高いクエリ)まで全部GraphQLでよいではないか
-
- バックエンド寄りはOpenCRUDに標準化する
- APIの間の関係性はBindingで定義する
开发应用所需的prisma-binding
然而,这还不够。
对于编写JavaScript应用程序的人来说,将查询结果转换为“有意义的对象”非常重要,为此需要使用ORM来手动实现大部分内容。
因此,prisma-binding可以使用GraphQL类型来自动生成查询参数和返回对象的类型定义。
在GraphQL中,查询的分工是采用OpenCRUD来定义查询。而在REST中,查询的定义是用Swagger的方式分工定义。
我认为最后有点不够完整的是,这就是Prisma的了不起之处,他们创造了这样的世界观。