在中文中,以下是对“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
请使用上述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
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
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
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
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
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
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
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。
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
bundle exec ruby app.rb
请在GraphQL中参考推荐使用一些方便的工具来使用GraphQL。
GraphiQL.app 可以进行API查询尝试的应用程序。
突变 (tū
询问
嗯,看起来有扩展性,让人觉得可以喜欢上它。

询问
嗯,看起来有扩展性,让人觉得可以喜欢上它。
