在中文中,以下是对“Sinatra GraphQL引入(与MongoDB的协作方式)”的一个本地化表达:Sinatra引入GraphQL(与MongoDB的协作方法)

前言我从朋友那里了解到了GraphQL这个可以替代REST API的东西,对它很感兴趣,所以试用了一下,并将此作为备忘录写成了一篇文章。
由于关于引入sinatra的文章比较少,所以我写了这篇文章。

今回はsinatraにてGraphQLを利用するためにgraphql-rubyというgemを使用しています。
上記gemの公式ページに使用方法等書いてありますので、一読するのがよいでしょう。

使用上述的 gem ,我们通过 graphql 进行查询和插入操作,将数据存储到 mongodb 中。

请参考GraphQL的官方页面是https://graphql.org/。建议大家在官方页面上学习GraphQL的相关知识,了解GraphQL是什么样的。

以下是graphql-ruby的官方网页:https://graphql-ruby.org/
=>这是graphql-ruby官方网页,可以在ruby中使用GraphQL。里面详细介绍了使用方法等,可以作为参考。

Sinatra引用参考:https://medium.com/hash32/sinatra-ruby-part-1-fdd664170715-graphql-server
=>這篇文章是有關導入Sinatra的參考資料。

Sinatra GraphQL:翻译成中文:Sinatra GraphQL在本次文章中最终要创建的代码如下:
https://github.com/Gen-Arch/graphql_test

MongoDB的准备本文将介绍如何使用Docker构建。
请使用上述GitHub上的docker-compose.yml进行操作。

docker-compose up

因为同时安装了mongo-express,所以您可以通过访问http://localhost:8081 来确认mongo。

安装宝石

宝石的说明这是要引入的宝石。

sinatra

rubyの軽量webフレームワーク

sinatra-contrib

sinatraの機能拡張

rack-contrib

rackの機能拡張

graphql

graphql用

mongoid

mongodb用

bson_ext

mongodbで使用するBSONを早くするため

安装创建gem文件

mkdir graphql_test
bundle init

在Gemfile中添加内容

gem 'sinatra'
gem 'sinatra-contrib'
gem 'rack-contrib'
gem 'graphql'
gem 'mongoid'
gem 'bson_ext'

安装

bundle install --path vendor/bundle

MongoDB的设置为了更容易理解,我们将为MongoDB创建一个独立的目录。

mkdir models

MongoDB连接配置文件

development:
  clients:
    default:
      database: test
      hosts:
        - localhost:27017

适用于连接MongoDB的Ruby代码
※请将class名称视为表名。

require 'mongoid'
Mongoid.load!(File.join(__dir__, 'mongoid.yml'))

class Test
  include Mongoid::Document

  field :name,  type: String
  field :text,  type: String
end

GraphQL的配置我们也会为GraphQL创建一个专门的目录。

mkdir graphql

在GraphQL中,我们定义查询用的query和增加值的mutation。然而,首先我们需要在mongodb中指定要添加的数据类型。

type定義ここもディレクトリを分けます。
typeを作成する際はGraphQL::Schema::Objectを継承します。

mkdir types
module Types
  class Test < GraphQL::Schema::Object
    field :name, String, null: false
    field :text, String, null: false
  end
end

不允许添加空值: null: false.

查询的定义

require_relative 'types/test'
require 'models/test'

class QueryType < GraphQL::Schema::Object
  description 'The query root of this schema'

  field :all, [Types::Test], null: true do
    description 'Response All Data'
  end

  def all
    Test.all
  end
end

根据这个定义,可以得到以下数值。

{
  all {
    name
    text
  }
}

# response
#{
#  "data": {
#    "all": [
#      {
#        "name": "test",
#        "text": "test hoge"
#      }
#    ]
#  }
#}

突变的定义。
这里也分开了目录。

mkdir mutation

定义用于值追加的变异体

$: << File.expand_path('../../', __dir__)
require 'models/test.rb'

module Mutations
  class CreateTest < GraphQL::Schema::Mutation
    description 'Creates a Test'

    argument :name, String, required: true
    argument :text, String, required: true

    field :success, Boolean, null: false
    field :errors, [String], null: false

    def resolve(name: ,text:)
      test = Test.new(
        name: name,
        text: text,
      )

      if test.save
        {
          success: true,
          errors: []
        }
      else
        {
          success: false,
          errors: test.errors.full_messages
        }
      end
    end
  end
end

创建一个用于调用上述内容的类型

require_relative 'mutation/create_test'

class MutationType < GraphQL::Schema::Object
  field :createTest, mutation: Mutations::CreateTest
end

按照这个定义,您可以如下添加值。

mutation {
  createTest(name: "test", text: "test hoge") {
    success
    errors
  }
}

# response
#{
#  "data": {
#    "createTest": {
#      "success": true,
#      "errors": []
#    }
#  }
#}

架构定义
定义一个用于调用查询和变更的模式。

require 'graphql'
require_relative 'mutation'
require_relative 'query'

class AppSchema < GraphQL::Schema
  query QueryType          #=> query
  mutation MutationType    #=> insert
end

在Sinatra中,我们将使用这个选项。

辛特拉的配置维览塔上看到的风景。

require 'sinatra'
require 'sinatra/json' #=> sinatraでjson形式でレスポンスする為
require_relative 'graphql/appschema'

# sinatraでjsonリクエストを受け取れるようにしています。
require 'rack/contrib'
use Rack::PostBodyContentTypeParser

# grapfqlのリクエスト処理
post '/graphql' do
  content_type :json
  puts params[:query]
  result = AppSchema.execute(
    params[:query],
    variables: params[:variables],
    context: { current_user: nil },
  )
  json result
end

启动Sinatra

bundle exec ruby app.rb

请在GraphQL中参考推荐使用一些方便的工具来使用GraphQL。

GraphiQL.app 可以进行API查询尝试的应用程序。

突变 (tū

DeepinScreenshot_select-area_20190406200313.png

询问

DeepinScreenshot_select-area_20190406200250.png嗯,看起来有扩展性,让人觉得可以喜欢上它。

bannerAds