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-expressapollo-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,订阅和跟踪。

 

posted @ 2018-08-28 11:41  tutu_python  阅读(177)  评论(0)    收藏  举报