前端使用
在使用http请求graphql服务器时的载体仍然是json,所以即使不使用任何特殊的库也可以与graphql服务器通信。
使用axios方式获取
先用比较经典的axios来试一下,创建一个html文件
<script src="https://cdn.bootcss.com/axios/0.19.0/axios.min.js"></script>
<script>
const query = `query($color:String) {
getBox {
width
balls (color:$color){
size
color
}
}
}`;
const variables = {
color: "red"
};
axios
.post("http://localhost:4000/graphql", {
query,
variables
})
.then(res => {
console.log("res: ", res);
});
</script>
另外GET也是完全合法的
axios.get("http://localhost:4000/graphql", {
params: { query, variables }
})
或者直接访问
http://localhost:4000/graphql?query=query($color:String){getBox{width,balls(color:$color){size,color}}}&variables={"color":"red"}
相比传统方式,graphql的特点就是返回值可预测,而且因为地址、请求方式和参数名固定,封装起来更简单。
现在看一下专业的客户端是这么做的,既然服务端使用了apollo-server,那客户端就看一下apollo-client怎么做的apollo-client官网。因为提供了错误处理,数据缓存,错误处理等等,配置项稍显复杂,官方提供了一个apollo-boost的东西简化了配置。我们可以自己对照官方实现一个简化版,深入学习一下。
作者:Type_Zer0
链接:https://juejin.im/post/5d9eef9151882520233f5b8c
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
typescript & type-graphql
迎合潮流,我们需要typescript的加持,否则怎么写都会被认为是玩具。
我们思考一个问题:
typescript的类型和graphql都是对模型的描述,基本一致,只在语法上有一些区别,能不能通用呢。官方提供了相关的API实现这个需求,但是语法并不简洁,type-graphql也许是更好的选择。
先导入typescript和type-graphql,还有之前用到的包的描述文件,另外type-graphql扫描注解用到了reflect-metadata这个还未进入标准的特性,所以需要引入这个包。
yarn add typescript type-graphql reflect-metadata @types/mysql @types/express
typescript老规矩,先写tsconfig.json,大概有以下内容就差不多了
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["es6", "es7", "esnext", "esnext.asynciterable"],
"noImplicitAny": false,
"moduleResolution": "node",
"baseUrl": ".",
"esModuleInterop": true,
"inlineSourceMap": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"watch": true
}
}
然后把所有require改成import,后缀名js改成ts就行了如果有报错就写个any
ts项目如何运行
运行项目我们使用ts-node,全局安装ts-node之后执行ts-node index.ts即可启动。
:::tips 正式项目我们可以使用pm2指定解释器或者将项目编译成js来运行。 :::
然后我们将type-graphql引入项目。
非常遗憾的是引入type-graphql后代码结构发生大改,除了数据库相关的内容基本可以重写了,graphql文件也不需要了。先建立一个models文件夹,新增两个文件Box.ts和Ball.ts