fullstack GraphQL学习笔记(3)服务端基本知识-网络层
GraphQL客户端与服务端如何通信:
1、通过HTTP
(1)GraphQL 与传输层无关
(2)Express
a、express实现的服务器
const express = require('express')
const app = express()
// respond with "hello world" when a GET request is received
app.get('/', function (req, res) {
res.send('<h1>Hello World</h1>')
})
app.listen(3000)
在Node.js上执行上述代码,就会显示hello world
当然还可以增加更多的路径或者使用post方法:
app.get('/goodbye', function (req, res) {
res.send('<h1>Goodbye</h1>')
})
app.post('/', function (req, res) {
res.send('<h1>You just made a POST request</h1>')
})
b、中间件:实现灵活性和模块化的关键
中间件就是在请求和返回中间,拦截请求并且执行一定的函数执行一定的任务。
中间件有三个参数,
req:请求
res:返回客户端的响应
next:调用下一个中间件。
中间件因为可以影响和改变输入和输出,因此可以实现诸如:身份验证,缓存,数据转换和验证,自定义业务逻辑的执行等等功能。下面是一个简单的中间件,用于显示登陆的时间。
function loggingMiddleware (req, res, next) {
console.log(`Received a request at: ${Date.now()}`)
next()
}
app.use(loggingMiddleware)
通过这种中间件方法获得的灵活性可以被类似的框架所利用graphql-express,apollo-server或者graphql-yoga都基于Express!
Express可以用于处理Http请求,GraphQL.js可以用于解析请求。我们需要粘合剂将他们连接起来,折旧是graphql-expresss和apollo-server的作用。
2、GraphQL中间件粘合HTTP和GraphQL.js
express-graphql:是facebook开发的中间件。
express-graphql的核心代码很简单,主要有两个功能:
(1)确保GraphQL.js可以执行传入POST请求正文中包含的GraphQL查询(或变异)。因此,它需要解析查询并将其转发给graphql函数执行。
(2)将执行结果附加到响应对象,以便将其返回给客户端
使用express-graphql创建服务器如下:
const express = require('express')
const graphqlHTTP = require('express-graphql')
const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql')
const app = express()
const schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: {
hello: {
type: GraphQLString,
resolve: (root, args, context, info) => {
return 'Hello World'
}
}
}
})
app.use('/graphql', graphqlHTTP({
schema,
graphiql: true // enable GraphiQL
}))
app.listen(4000)
apollo-server与express-graphql本质非常像。它是很好的与除express之外的其他库集成如koa,hapi等。
示例:
const express = require('express')
const bodyParser = require('body-parser')
const { graphqlExpress, graphiqlExpress } = require('apollo-server-express')
const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql')
const schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: {
hello: {
type: GraphQLString,
resolve: (root, args, context, info) => {
return 'Hello World'
}
}
}
})
})
const app = express()
app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }))
app.get('/graphiql', graphiqlExpress({ endpointURL: '/graphql' })) // enable GraphiQL
app.listen(4000)
graphql-yoga创建GraphQL服务端最简单的方法
const { GraphQLServer } = require('graphql-yoga')
const typeDefs = `
type Query {
hello: String!
}
`
const resolvers = {
Query: {
hello: (root, args, context, info) => 'Hello World'
}
}
const server = new GraphQLServer({ typeDefs, resolvers })
server.start() // defaults to port 4000
graphql-yoga还内置支持GraphQL Playgrounds,订阅和跟踪。
浙公网安备 33010602011771号