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服务已经完整的联系起来了。
浙公网安备 33010602011771号