Graphql binding

GraphQl đang là một công nghệ mới được nhiều lập trình viên quan tâm, sau đây mình xin chia sẻ về Graphql binding.

GraphQL bindings are modular building blocks that allow to embed existing GraphQL APIs into your own GraphQL server.

Theo định nghĩa Graphql binding là một module cho phép ta nhúng các GraphqlAPI vào trong GraphQL server. Điều này làm cho ta có thể dễ dàng truy cập dữ liệu từ nhiều nguồn Graphql khác nhau và tích hợp vào một GraphqlAPI. Ý tưởng chính của Graphql binding là tạo ra một object đại diện cho các chức năng của GraphqlAPI. Thay vào việc query bằng plain string lên API (giống với fetch hoặc graphql-request) như sau :

mutation 
    createPost("post_name", "post_content") {
        id,
        name,
        content
    }
}

thì ta có thể định nghĩa mutation hoặc query như sau

    createPost(parent, { title, text }, ctx, info) {
      return ctx.db.mutation.createPost(
        {
          data: {
            title,
            text,
          },
        },
        info,
      )
    }
    const post = postbinding.db.query.createPost({
        "name",
        "content"
    })

Chức năng chính của GraphqlBinding ở class Binding. Binding nhận một graphql schema là một parameter trong constructor, tạo ra một root field của graphql schema và cho phép ta query trực tiếp vào các operation của GraphqlAPI ta binding. Nếu các bạn đã biết Prisma - một package cho phép ta tương tác với database thì Prisma cũng cung cấp cho ta các API trên tầng DB. Và prisma-binding là một Graphql binding cho Prisma service(Graphql Database) Mình tạo một serverGraphql với context là một object trả về thông tin của request và binding của DB Prisma

const {Prisma} = require('prisma-binding')
const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
  context: req => ({
    ...req,
    db: new Prisma({
      typeDefs: 'src/generated/prisma.graphql', // the generated Prisma DB schema
      endpoint: '__PRISMA_ENDPOINT__',          // the endpoint of the Prisma DB service
      secret: 'mysecret123',                    // specified in database/prisma.yml
      debug: true,                              // log all GraphQL queries & mutations
    }),
  }),
})

prisma.graphql là một file schema do prisma generated ra, cung cấp các API ở tầng DB, để sử dụng trực tiếp nó chúng ta có thể query trên server hoặc tạo một binding của API đó trên server và query. giờ các mutation, query hoặc subscription mình có thể định nghĩa query như sau:

  const resolvers = {
  Query: {
    posts(parent, args, ctx, info) {
      return ctx.db.query.posts({ }, info)
    },
    post(parent, args, ctx, info) {
      return ctx.db.query.post({ where: { id: args.id } }, info)
    },
  },
}

và sau đó ta có thể dễ dàng query tới db. Graphql giúp ta có thể binding API vào server, tuy nhiên việc định nghĩa schema, resolver ta vẫn phải viết. Graphql-binding là một giải pháp rất hiệu quả cho việc share các GraphqlAPI với nhau.