graphql-server node版(四)

连接graphql-yoga 和 prisma服务

1、安装prisma-binding,并将prisma示例绑定到context.

我们要借用工具包prisma-bindings来连接Graphql服务器和prisma服务。

在hackernews-node文件夹下安装prisma-bindings:

yarn add prisma-binding

  安装完prisma-bindings,我们可以将Prisma实例绑定到context中,以便于在resolvers当中可以访问Prisma服务

在index.js文件中

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',
      endpoint: 'https://localhost:4466',
      secret: 'mysecret123',
      debug: true,
    }),
  }),
})

  Prisma实例中的typeDefs现在还没有,我们一会会通过prisma deploy自动生成prisma.graphql.这之前还需要配置和修改一些文件。

  endpoint:填写自己实际部署的地址和端口

  debug:如果将debug设置为ture的话,那么所有通过Prisma实例向prisma服务发送的请求都会打印在控制台。

2、修改App层的resolvers

(1)删除我们手工定义的links和idCount,因为我们要使用数据库来存储他们了。

(2)修改解析函数,我们要让解析函数去调用prisma服务的api了。

const resolvers = {
  Query: {
    info: () => `This is the API of a Hackernews Clone`,
    feed: (root, args, context, info) => {
      return context.db.query.links({}, info)
    },
  },
  Mutation: {
    post: (root, args, context, info) => {
      return context.db.mutation.createLink({
        data: {
          url: args.url,
          description: args.description,
        },
      }, info)
    },
  },
}

  由于context中绑定了db,即(Prisma实例),Prisma实例可以将prisma 数据层的schema转换为对应javascript 函数我们可以调用。如db.query.links()函数和db.mutation.createLink()函数。

该函数接受两个参数,第一个参数代表了客户端查询可能输入的参数。第二个参数是info,代表客户端查询的信息,如查询了那些字段。

这样prisma服务便知道了

(1)查询类型db.query,db.mutation,

(2)查询的根字段links/createLink,

(3)知道了查询的参数Links({}),createLInk(url,description)

(4)查询的字段集,info。也可以用下面的表述代替

const selectionSet = `
{
  id
  description
  url
}
`
context.db.query.links({}, selectionSet)

  知道了上述信息,prisma便可以将客户端的查询解析为数据库语言了。

3、下载prisma schema,

我们在前面配置GraphQLserver时使用了src/generated/prisma.graphql,但现在还没有该文件,我们需要从prisma服务上下载该文件到本地。以便new Prisma实例可以知道可以调用的typeDefs

有很多种方式可以获取prisma schema,这里使用graphql-cli结合graphql-config

在hackernews-node中创建一个.graphql-config.yml文件

输入下列内容:

projects:
  app:
    schemaPath: src/schema.graphql
    extensions:
      endpoints:
        default: http://localhost:4000
  database:
    schemaPath: src/generated/prisma.graphql
    extensions:
      prisma: database/prisma.yml

  这里指定了两个project,一个是app应用层即graphql-yoga,一个是database prisma层,每一层都有一个schemaPath,并且指定了每一个project的访问端口,App层的为http://localhost:4000,database层的在database/prisma.yml文件中指定。

这样设置的好处是:

我们可以在playground中同时与App层的api和database层的api进行交互了。

在prisma.yml中配置下载地址信息:

hooks:
  post-deploy:
    - graphql get-schema --project database

  

在部署Prisma服务时prisma deploy,当部署完成后,Prisma CLI会将生成的Prisma数据库架构下载到指定位置即:src/generated/prisma.graphql。

prisma-cli也是用.graphql-config.yml中的信息,因此现在可以在hackernews-node文件加下使用prisma了而不是database文件夹。

deploy钩子调用graphqlCLI命令,因此我们需要全局安装它:

yarn global add graphql-cli

  这里如果yarn安装不成功,可以使用npm安装

现在我们可以在根目录下运行deploy prisma以便将prisma schema下载到本地了

prisma deploy

  

在开始测试之前,我们做最后一点修改

打开src/schema.graphql并删除该Link类型。我们可以使用prisma层定义的Link.导入prisma.graphql

在shema.grqphql中

# import Link from "./generated/prisma.graphql"

  当然不删除也没有关系,但是每次修改Link,我们都需要修改datamodel.graphql中的Link,再修改一次schema.graphql中的Link,多次一举。因此我们这里采用引用prisma中Link的方式。这样每次修改仅需要修改datamodel中的Link,然后再次运行prisma deploy 便可以了。

开始测试:

启动graphql-yoga服务器

node src/index.js

  打开playgroud,可以看到两层api了。

graphql playground

  ok,现在graphql-yoga服务和prisma服务已经完整的联系起来了。

 

posted @ 2018-09-09 19:40  tutu_python  阅读(160)  评论(0)    收藏  举报