• Stars
    star
    106
  • Rank 325,871 (Top 7 %)
  • Language
    JavaScript
  • License
    Apache License 2.0
  • Created almost 8 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Third party GraphQL support for LeanCloud, running on LeanEngine

LeanCloud GraphQL

运行在云引擎上的第三方 GraphQL 支持,允许你用 GraphQL 查询 LeanCloud 云存储中的所有数据。

部署到云引擎

LeanCloud 命令行工具

GraphQL

GraphQL 是 FaceBook 开源的一套查询语言,你可以用它定义数据的格式和获取方法(这就是 leancloud-graphql 做的工作,它会自动将你在 LeanCloud 的数据结构转换为 GraphQL 的 Schema),然后便可以在客户端以一种非常灵活的语法来获取数据,甚至也可以用它来创建和更新数据。

在使用 leancloud-graphql 之前,你可能需要先了解一下 GraphQL 的语法 ,下面我们不会过多地介绍 GraphQL 本身。这篇文章将使用 JavaScript SDK 文档中的 示例数据结构 进行讲解。

GraphQL 在客户端几乎不需要什么 SDK,你可以花几行代码封装一个工具函数:

function requestGraphQL(query) {
  return fetch('/', {
    method: 'POST',
    body: query
  }).then( res => {
    return res.json();
  }).then( result => {
    return result.data;
  });
}

我们也用 GraphiQL 提供了一个支持自动补全等功能的 GraphQL 控制台(本地调试时为 http://127.0.0.1:3000/),你可以在这里测试你的查询。

我们会应用客户端发来的 sessionToken,确保在用户的权限范围内进行查询。你可以从我们的 JavaScript SDK 上获取 sessionToken 并随着请求发送,修改 requestGraphQL:

  headers: {
    'Content-Type': 'application/graphql',
+   'X-LC-Session': AV.User.current() && AV.User.current().getSessionToken()
  },

获取数据

最简单的一个查询:

requestGraphQL(`
  query {
    Todo {
      title, priority
    }
  }
`)

默认会返回最多 100 条数据:

{
  Todo: [
    {title: "紧急 Bug 修复", priority: 0},
    {title: "打电话给 Peter",priority: 5},
    {title: "还信用卡账单", priority: 10},
    {title: "买酸奶", priority: 10},
    {title: "团队会议", priority: 5}
  ]
}

你可以在此基础上添加排序、条数限制等选项:

  • ascending 按照指定字段升序。
  • descending 按照指定字段降序。
  • limit 条数限制。

例如我们按照优先级升序排序,取最重要的两个任务:

query {
  Todo(ascending: priority, limit: 2) {
    title, priority
  }
}

结果:

{
  Todo: [
    {title: "紧急 Bug 修复", priority: 0},
    {title: "打电话给 Peter",priority: 5}
  ]
}

查询条件

首先你可以按照 objectId 进行简单的查询:

query {
  Todo(objectId: "5853a0e5128fe1006b5ce449") {
    title, priority
  }
}

结果:

{
  Todo: [
    {title: "还信用卡账单", priority: 10}
  ]
}

equalTo

你也可以像 LeanCloud 的 SDK 一样使用多种查询条件:

query {
  Todo(equalTo: {title: "团队会议"}) {
    title
  }
}

exists

exists 可以用来查询存在或不存在某一字段的对象,例如我们查询存在 title 但不存在 content 的 Todo:

query {
  Todo(exists: {title: true, content: false}) {
    title, content
  }
}

范围查询

query {
  Todo(greaterThanOrEqualTo: {priority: 10}) {
    title, priority
  }
}

目前支持的查询包括:

  • greaterThan 约束指定列大于特定值。
  • greaterThanOrEqualTo 约束指定列大于等于特定值。
  • lessThan 约束指定列小于特定值。
  • lessThanOrEqualTo 约束指定列小于等于特定值。

数组查询

query {
  Todo(containedIn: {tags: ["Online"]}) {
    title, tags
  }
}

目前支持的数组查询包括:

  • containedIn 约束指定列中包含特定元素。
  • containsAll 约束指定列中包含所有元素。

组合查询

你可以将我们前面提到的所有查询条件组合在一起:

query {
  Todo(exists: {content: true}, ascending: priority, greaterThan: {priority: 5}) {
    title, content, priority
  }
}

关系查询

Relation

如果对象的一个字段是 Relation,那么你就可以在 GraphQL 中将它展开,例如我们可以查询每个 TodoFolder 中包含的 Todo:

query {
  TodoFolder {
    name, containedTodos {
      title, priority
    }
  }
}

结果:

{
  TodoFolder: [{
    name: "工作",
    containedTodos: [
      {title: "紧急 Bug 修复", priority: 0},
      {title: "打电话给 Peter", priority: 5},
      {title: "团队会议", priority: 5}
    ]
  }, {
    name: "购物清单",
    containedTodos: [
      {title: "买酸奶", priority: 10}
    ]
  }]
}

Pointer

如果一个字段是 Pointer 你也可以将它展开,例如我们可以查询 Todo 的创建者(到用户表的指针):

query {
  Todo(limit: 1) {
    title, owner {
      username, email
    }
  }
}

结果:

{
  Todo: [
    {
      title: "紧急 Bug 修复",
      owner: {
        username: "someone",
        email: "[email protected]"
      }
    }
  ]
}

查询条件

你也可以在关系查询上附加查询参数或查询条件:

query {
  TodoFolder {
    name, containedTodos(limit: 1, exists: {content: true}) {
      title, content
    }
  }
}

结果:

{
  TodoFolder: [{
    name: "工作",
    containedTodos: [
      {title: "团队会议", content: "BearyChat"}
    ]
  }, {
    name: "购物清单",
    containedTodos: []
  }, {
    name: "someone",
    containedTodos: [
      {title: "还信用卡账单", content: "2016 年 12 月"}
    ]
  }]
}

支持的参数和条件包括:ascendingdescendinglimitobjectIdequalToexistsgreaterThangreaterThanOrEqualTolessThanlessThanOrEqualTocontainedIncontainsAll

反向关系

在实现一对多关系时,我们经常会在「多」上面保存一个到「一」的指针,leancloud-graphql 会自动在「多」上面创建一个属性,用来表示反向关系。例如因为 Todo 的 owner 是一个指向 _User 的 Pointer,所以 _User 上会自动出现一个 ownerOfTodo

query {
  _User {
    username, ownerOfTodo {
      title
    }
  }
}

这样我们便可以查到每个用户的 Todo:

{
  _User: [{
    username: "someone",
    ownerOfTodo: [
      {title: "紧急 Bug 修复"},
      {title: "打电话给 Peter"},
      {title: "还信用卡账单"},
      {title: "买酸奶"}
    ]
  }]
}

你也可以在 Relation 上进行反向查询,例如查询每个 Todo 所属的 TodoFolder:

query {
  Todo {
    title, containedTodosOfTodoFolder {
      name
    }
  }
}

结果(省略了一部分):

{
  Todo: [{
    title: "紧急 Bug 修复",
    containedTodosOfTodoFolder: [
      {name: "工作"},
      {name: "someone"}
    ]
  }, {
    title: "买酸奶",
    containedTodosOfTodoFolder: [
      {name: "购物清单"},
      {name: "someone"}
    ]
  }, {
    title: "团队会议",
    containedTodosOfTodoFolder: [
      {name: "工作"}
    ]
  }]
}

多级关系

在 GraphQL 中你甚至可以进行多层级的关系查询:

query {
  TodoFolder {
    name,
    containedTodos {
      title, owner {
        username, email
      }
    }
  }
}

结果(省略了一部分):

{
  TodoFolder: [{
    name: "工作",
    containedTodos: [{
      title: "紧急 Bug 修复",
      owner: {
        username: "someone",
        email: "[email protected]"
      }
    }, // ...
    ]
  }, // ...
  ]
}

修改对象

GraphQL 毕竟是一个数据查询语言,因此我们仅提供了非常有限的创建和更新对象的功能。

创建对象

你可以这样创建一个对象,并要求服务器返回 objectId、标题和优先级:

mutation {
  Todo(title: "思考巨石阵是如何修建的") {
    objectId, title, priority
  }
}

结果:

{
  Todo: {
    objectId: "5853adb7b123db006562f83b",
    title: "思考巨石阵是如何修建的",
    priority: 10
  }
}

更新对象

然后你可以用非常相似的语法来更新这个对象(当你提供了 objectId 便是更新对象):

mutation {
  Todo(objectId: "5853adb7b123db006562f83b", priority: 5) {
    title, priority
  }
}

结果:

{
  Todo: {
    title: "思考巨石阵是如何修建的",
    priority: 5
  }
}

添加到现有项目

如果要添加到现有项目,需要先将 leancloud-graphql 添加为依赖:

npm install --save leancloud-graphql

请确保 Node.js 版本在 4.0 以上。

作为中间件添加

leancloud-graphql 导出了一个 express 中间件,可以直接添加到现有的 express 项目上:

var leancloudGraphQL = require('leancloud-graphql').express;
var app = express();
app.use('/graphql', leancloudGraphQL());

leancloudGraphQL 有一些选项:

  • graphiql 开启调试控制台,默认 true.
  • cors 提供跨域支持,默认 true.
  • pretty 格式化返回的 JSON。

使用该中间件时请确保环境变量中有 LEANCLOUD_ 系列的环境变量,即需要运行在云引擎上或用 lean up 启动。

获取 GraphQLSchema

leancloud-graphql 默认导出了一个构建 GraphQLSchema 的函数:

var buildSchema = require('leancloud-graphql');
var {printSchema} = require('graphql');

buildSchema({
  appId: process.env.LEANCLOUD_APP_ID,
  appKey: process.env.LEANCLOUD_APP_KEY,
  masterKey: process.env.LEANCLOUD_APP_MASTER_KEY
}).then( schema => {
  console.log(printSchema(schema));
});

More Repositories

1

ChatKit-OC

此项目已经废弃,以后不再维护。我们推出了基于 Swift SDK 的 Chat Demo。
Objective-C
2,134
star
2

docs

LeanCloud Documentation
JavaScript
606
star
3

leancloud-sdk

LeanCloud SDK repository.
Objective-C
332
star
4

leantodo-weapp

LeanTodo implemented with Weapp
JavaScript
331
star
5

javascript-sdk

LeanCloud JavaScript SDK
JavaScript
330
star
6

leanmessage-demo

使用 LeanCloud 实时通讯搭建的聊天 WebApp
JavaScript
323
star
7

ticket

TypeScript
291
star
8

LeanCloudLiveKit-iOS

Show how to add IM module to Live app
Objective-C
285
star
9

satori

Satori 是一个 LeanCloud 维护的监控系统,inspired by Open-Falcon
Python
232
star
10

js-realtime-sdk

LeanCloud Realtime Message JavaScript SDK
JavaScript
201
star
11

objc-sdk

LeanCloud Objective-C SDK
Objective-C
197
star
12

leancloud-social-ios

LeanCloud 社交登录组件,轻松加入 QQ、微博、微信登录
Objective-C
160
star
13

LeanEngine-WechatBot

该项目为微信公众平台开发指南文档所对应的代码,请参照文档进行开发,该项目不再维护
JavaScript
160
star
14

LeanStorageDemo-iOS

基于 iOS SDK,全面示例了 LeanCloud 的存储功能。
Objective-C
157
star
15

swift-sdk

LeanCloud Swift SDK
Swift
139
star
16

node-js-getting-started

LeanEngine Node.js getting started.
JavaScript
131
star
17

leanengine-nodejs-demos

云引擎 Node.js 常用功能和示例汇总
JavaScript
108
star
18

python-sdk

LeanCloud Python SDK
Python
99
star
19

LeanCloudChatKit-Android

Java
96
star
20

lean-cli

LeanEngine Command Line Tool
Go
81
star
21

leancloud-feedback-ios

LeanCloud 开源的用户反馈组件
Objective-C
78
star
22

cloud-code-alipay

因支付宝接口变动频繁,该项目不再维护,代码可能无法正常工作。
JavaScript
77
star
23

LeanStorageDemo-Android

基于 Android SDK,全面示例了 LeanCloud 的存储功能
Java
71
star
24

StorageStarted

Objective-C
70
star
25

avoscloud-code-command

此版本命令行工具已经废弃,以后不再维护。我们推出了基于 Go 的新版本的命令行工具
JavaScript
66
star
26

leantodo-react-native

Todo app using LeanCloud and React Native
JavaScript
66
star
27

java-unified-sdk

LeanCloud Java SDK(兼容 Android)
Java
65
star
28

leanengine-node-sdk

LeanEngine Node.js SDK
JavaScript
62
star
29

android-push-demo

Android Push Demo ,示例 LeanCloud 的推送功能
Java
60
star
30

weapp-pay-getting-started

LeanCloud 小程序微信支付后端示例
JavaScript
59
star
31

php-sdk

LeanCloud PHP SDK
PHP
53
star
32

python-getting-started

LeanEngine Python runtime project template
Python
53
star
33

leantodo-vue

LeanTodo implemented with Vue.js
JavaScript
49
star
34

swift-sdk-demo

Demo for LeanCloud Swift SDK
Swift
49
star
35

weapp-polyfill

Polyfills for w3c API on top of Weapp API
JavaScript
46
star
36

open-old

LeanCloud Open Resources
CSS
41
star
37

android-sdk-all

Java
39
star
38

js-push-sdk

[已废弃] LeanCloud Push JavaScript SDK.
JavaScript
35
star
39

Storage-SDK-Flutter

LeanCloud Storage SDK for Flutter/Dart.
Dart
34
star
40

flask-todo-demo

Python port of LeanTodo.
HTML
31
star
41

react-native-installation-demo

Objective-C
29
star
42

Realtime-SDK-Flutter

LeanCloud Flutter Plugin SDK
Dart
26
star
43

lean-cache-demos

该项目已被归档,后续将不再维护,请在 leancloud/leanengine-nodejs-demos 中查看有关 LeanCache 的最新示例。
JavaScript
26
star
44

FlutterLeaveDemo

Flutter 请假、写周报应用
Dart
25
star
45

BallBattle-Cocos

模拟《球球大作战》demo
JavaScript
24
star
46

csharp-sdk

LeanCloud C# SDK
C#
24
star
47

leanmessage-javascript-sdk

LeanMessage JavaScript SDK
JavaScript
22
star
48

servlet-getting-started

Java
17
star
49

LeanCloudRocks

ReactNative meets LeanCloud
Objective-C
17
star
50

filter-service

A RESTFul bloom filters daemon.
Java
16
star
51

cpp-sdk

[NO MAINTAINED] LeanCloud C++ SDK
C++
16
star
52

BallBattle-Unity

《球球大作战》Demo Unity 版本
C#
16
star
53

multiplayer-turn-based-game-demo

回合制对战游戏示例
TypeScript
15
star
54

LeanCloudLiveKit-Android

Java
15
star
55

react-native-image-upload-demo

Java
14
star
56

joke

LeanCloud 中发生的一些搞笑的事情……Orz
14
star
57

realtime-messaging-signature-cloudcode

该项目已被归档,后续将不再维护,请在 leancloud/leanengine-nodejs-demos 中查看有关实时通讯签名的最新示例。
JavaScript
14
star
58

realtime-SDK-dotNET

LeanCloud Instants Messaging SDK for Portable & Unity & .NET Core written by c#
C#
13
star
59

resty-marathon-lb

基于 OpenResty 的 Marathon 服务发现 & 路由
Lua
12
star
60

spring-boot-getting-started

Java
12
star
61

go-sdk

Golang SDK for LeanCloud Storage and LeanEngine
Go
12
star
62

delphi-sdk

[NO MAINTAINED] Delphi SDK for LeanCloud BaaS demo
Pascal
12
star
63

java-sdk

Java
11
star
64

unity-sdk

Unity SDK
11
star
65

Akara

A Swift networking library based on cURL.
Swift
11
star
66

hackthon-eye

黑客马拉松项目——眼缘
JavaScript
11
star
67

django-getting-started

Python
11
star
68

mixpush-demos

Java
10
star
69

answer-game

一个答题类小游戏
JavaScript
9
star
70

leancloud-smsdemo-ios

LeanCloud SMS Demo
Objective-C
9
star
71

leanengine-nodejs-apm

LeanEngine performance monitoring for Node.js application
JavaScript
9
star
72

js-analytics-sdk

[已废弃] LeanCloud JavaScript Analytics SDK
JavaScript
9
star
73

leancloud-feedback-android

LeanCloud 开源的用户反馈组件
Java
9
star
74

ios-feedback-demo

iOS 小项目,用来展示如何快速集成 LeanCloud 反馈模块
Objective-C
8
star
75

use-resource

A set of simple utilities for declarative async resource fetching.
TypeScript
8
star
76

leanengine-java-sdk

LeanEngine Java lib
Java
8
star
77

slim-todo-demo

LeanCloud todo demo for Slim PHP Framework
HTML
8
star
78

react-hook-demo

A React hook demo with backend data store.
JavaScript
8
star
79

clj-archaius

A Clojure library designed to use Netflix/archaius for configuration management.
Clojure
7
star
80

swift-programming

Chinese Version Of Swift Programming Language
7
star
81

LeanCloudSNSDemo-Android

Android 第三方登录示例 Demo
Java
6
star
82

CSharp-SDK-Unity-Demo

CSharp SDK Unity Demo
C#
6
star
83

WeShare

Java
6
star
84

knowhow

LeanCloud 知识库 - 用户使用常见问题
Shell
6
star
85

LCLogger

Map NSLogger to LeanCloud namespace (LC)
Objective-C
5
star
86

Play-SDK-CSharp

C#
5
star
87

leancloud-status

LeanCloud Status Page
JavaScript
5
star
88

PuppetChat

Deprecated
Objective-C
5
star
89

LeanEngine-OAuth-China

该项目已被归档,后续将不再维护,请在 leancloud/leanengine-nodejs-demos 中查看云引擎的最新示例。
JavaScript
5
star
90

java-common

Java
5
star
91

affiliate-web

JavaScript
4
star
92

Swift-Sample-Code

Swift SDK 文档中的示例代码 。
Swift
4
star
93

Play-Quick-Start-JS

JavaScript
4
star
94

slim-getting-started

Slim Getting Started for LeanEngine
PHP
4
star
95

kafka-java-consumer

A Kafka consumer which can help you to overcome common pitfalls
Java
4
star
96

LeanCloudBirthday

五周年小游戏
JavaScript
4
star
97

TypeScript-Sample-Code

TypeScript SDK 文档中的示例代码
TypeScript
4
star
98

paas.product

Paas product release repo.
Objective-C
4
star
99

typed-leancloud-jssdk

Typed define for leancloud-jssdk.
TypeScript
4
star
100

leanengine-python-apm

Python
4
star