使用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”的表。

image.png

如果您想对查询参数或返回值进行轻微修改,可以在解析器内部进行自定义实现。

使用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 查询的感觉。让我们来比较一下。

SQLOpenCRUD on GraphQLMongoDBselect * 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的了不起之处,他们创造了这样的世界观。

bannerAds