apollo-link-firebase 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
apollo-link-firebase 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
apollo-link-firebase 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT License
开发语言 Java
操作系统 跨平台
软件类型 开源软件
所属分类 大数据数据查询
开源组织
地区 不详
投 递 者 首席测试
适用人群 未知
收录时间 2021-11-23

软件简介

npm version CircleCI gitter

Apollo-link-firebase

apollo-link-firebase provides you a simple way to query Firebase in graphQL with Apollo-client without building a graphQL server

Currently, we support features below:

  1. Query: All sorting and filtering methods on document are supported.
  2. Mutation: deal with set, update, remove methods with graphQL mutation.
  3. Realtime Subscription: Listen to your Firebase events using graphQL Subscription.
  4. Data Join: Retrieve your data from different paths using one graphQL.

Contents

Installation

yarn add apollo-link-firebase

Quickstart

// rtdb stands for realtime database
import {createRtdbLink} from 'apollo-link-firebase';
import * as firebase from 'firebase';

// initialize firebase
firebase.initializeApp({
  // configs
});

// create Realtime Database link
const rtdbLink = createRtdbLink({
  database: firebase.database()
});

const client = new ApolloClient({
  link: rtdbLink,
  cache: new InMemoryCache(),
});

// A simple query to retrieve data from 
// firebase.database().ref("/profile/me")
// @rtdbQuery stands for Realtime Database Query
const query = gql`
  query myProfile {
    me @rtdbQuery(ref: "/profile/me") {
      name
    }
  }
`;

// Invoke the query and log the person's name
client.query({ query }).then(response => {
  console.log(response.data.name);
});

Retrieve Object Data

Return with __typename

In Apollo client, InMemoryCache use __typename and id to save your data in store.

Using @key directive, you can speficy which field you want to return with the key of snapshot

const query = gql`
  query myProfile {
    me @rtdbQuery(ref: "/profile/me", type: "Profile") {
      id @key
      name
    }
  }
`;

Response

{
  __typename: "Profile",
  id: "me",
  name: "wwwy3y3"
}

Work with Lists of Data

For example, your data in Firebase could be like

{
  users: {
    id1: {
      name: "alovelace",
      birth: 1815
    },
    id2: {
      name: "ghopper",
      birth: 1906
    }
  }
}

Basic Query

We can query all users, and use @array directive to parse data to array

const query = gql`
  query getUsers {
    users @rtdbQuery(ref: "/users", type: "Users") @array {
      id @key
      name
    }
  }
`;

Response

[{
  __typename: "Users",
  id: "id1",
  name: "alovelace",
  birth: 1815
}, {
  __typename: "Users",
  id: "id2",
  name: "ghopper",
  birth: 1906
}]

Advance Query

In firebase client js sdk, We can get data by using sorting and filtering API

We provide corresponding API in @rtdbQuery directive arguments. In the following example, we query lists of data using orderByChild("birth") and limitToFirst(1)

const query = gql`
  query getUsers {
    users @rtdbQuery(ref: "/users", orderByChild: "birth", limitToFirst: 1, type: "Users") {
      name
    }
  }
`;

Response

[{
  __typename: "Users",
  id: "id1",
  name: "alovelace",
  birth: 1815
}]

rtdbQuery Directive Arguments

  • ref: string
  • orderByChild: string
  • orderByKey: boolean. e,g orderByKey: true
  • orderByValue: boolean
  • startAt: any
  • endAt: any
  • equalTo: any
  • limitToFirst: number
  • limitToLast: number

More Examples

Mutation

We only take payload from input key from the recommendations in this article

const mutation = gql`
  fragment Input on firebase {
    string: String
    number: Number
  }

  mutation($ref: string, $input: Input!) {
    updateArticle(input: $input) @rtdbUpdate(ref: $ref, type: "Article") {
      id @key
      string
      number
    }
  }
`;

We support four directives for mutation

  • @rtdbUpdate: Firebase update
  • @rtdbSet: Firebase set
  • @rtdbRemove: Firebase remove
  • @rtdbPush: Push new element under ref, sugar api for firebase push and set

Examples

@rtdbRemove

const mutation = gql`
  mutation($ref: string) {
    remove @rtdbRemove(ref: $ref)
  }
`;

@rtdbPush and @pushKey

const mutation = gql`
  fragment ProfileInput on firebase {
    string: String
    number: Number
  }

  mutation($ref: string, $input: ProfileInput!) {
    pushdata(input: $input) @rtdbPush(ref: $ref) {
      id @pushKey
      string
      number
    }
  }
`;

// variables
const variables = {
  ref: "/users",
  input: {
    string: "string",
    number: 1
  }
}

// response
{
  id: "-KjCIvxsKueb3Hf2LIOp",
  string: "string",
  number: 1
}

Subscription

We support four events in Firebase, more on Firebase document

You can use all the query api supported in @rtdbQuery, more advanced query examples in wiki

Usage

const subQuery = gql`
  subscription {
    newComment @rtdbSub(ref: "/comments", event: "value") {
      id @key
      content
    }
  }
`;

Directives

  • value: @rtdbSub(ref: string, event: "value")
  • child_added: @rtdbSub(ref: string, event: "child_added")
  • child_changed: @rtdbSub(ref: string, event: "child_changed")
  • child_removed: @rtdbSub(ref: string, event: "child_removed")

Example

Simple Todo React Application

Here's a simple React + apollo-link-firebase todo app

Roadmap

  • support firebase transaction
  • support firestore
  • support authenticate mutation
  • support storage mutation

Contribution

Contributions are welcome and extremely helpful 🙌

Feel free to join our gitter channel to discuss with us!

展开阅读全文

代码

评论

点击引领话题📣
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
Async 安全漏洞
原型污染
Async是英国Caolan McMahon个人开发者的一个实用模块。用于使用异步 JavaScript。 Async 3.2.1 及之前版本存在安全漏洞,该漏洞源于 mapValues() 方法。攻击者可通过 mapValues() 方法获取权限。
CVE-2021-43138 MPS-2021-34434
2022-08-08 20:23
handlebars 存在MAID漏洞
MAID
handlebars 是 Mustache 模板语言的扩展。此软件包的受影响版本容易受到原型污染。
MPS-2022-13730
2022-08-08 20:23
ua-parser-js 安全漏洞
表达式注入
ua-parser-js是基于JavaScript的User-Agent字符串解析器。可以在浏览器(客户端)或node.js(服务器端)环境中使用。也可以作为jQuery / Zepto插件,Bower / Meteor软件包和RequireJS / AMD模块使用。 ua-parser-js 包0.7.22版本存在安全漏洞,攻击者可利用该漏洞进行ReDoS攻击。以下产品及版本受到影响: Redmi Phones,Mi Pad Tablets UA。
CVE-2020-7733 MPS-2020-13044
2022-08-08 20:23
pathval 输入验证错误漏洞
原型污染
pathval是Chai.js团队的一个用于基于 String 字符串来检索和设置对象的 Npm 代码库 pathval 1.1.1之前版本存在输入验证错误漏洞。该漏洞源于网络系统或产品未对输入的数据进行正确的验证。
CVE-2020-7751 MPS-2020-15246
2022-08-08 20:23
Indutny Elliptic 加密问题漏洞
密码算法不安全
Indutny Elliptic是Indutny个人开发者的一个基于Javascript为应用提供快速椭圆曲线加密的代码库。 Indutny Elliptic 存在安全漏洞,该漏洞源于没有检查来确认公钥。
CVE-2020-28498 MPS-2021-1176
2022-08-08 20:23
protobufjs 安全漏洞
不正确的正则表达式
protobufjs是一个能够将结构化数据序列化的JavaScript实现。 protobufjs中存在拒绝服务漏洞。攻击者可借助无效的特制.proto文件利用该漏洞造成拒绝服务。
CVE-2018-3738 MPS-2018-7303
2022-08-08 20:23
lodash 原型污染漏洞
拒绝服务
lodash是一款开源的JavaScript实用程序库。 lodash 4.17.11之前版本中由于函数merge,mergeWith和defaultsDeep可以添加或修改Object.prototype导致原型污染漏洞,。 这会造成通过触发 JavaScript 异常来拒绝服务,或者篡改应用程序源代码以强制攻击者注入的代码路径,从而导致远程代码执行
CVE-2018-16487 MPS-2019-1228
2022-08-08 20:23
node-tar 后置链接漏洞
在文件访问前对链接解析不恰当(链接跟随)
node-tar是一款用于文件压缩/解压缩的软件包。 node-tar 4.4.2之前版本中存在后置链接漏洞。该漏洞源于网络系统或产品未正确过滤表示非预期资源的链接或者快捷方式的文件名。攻击者可利用该漏洞访问非法的文件路径。
CVE-2018-20834 MPS-2019-4705
2022-08-08 20:23
codecov-node 操作系统命令注入漏洞
命令注入
codecov-node是一款测试覆盖率检测软件包。 codecov-node(npm) 3.7.1之前版本中存在操作系统命令注入漏洞。攻击者可借助特制请求利用该漏洞在系统上执行任意命令。
CVE-2020-15123 MPS-2020-10705
2022-08-08 20:23
Codecov NodeJs Uploader 注入漏洞
注入
Codecov NodeJs Uploader 3.6.2之前版本中存在注入漏洞。远程攻击者可借助‘gcov-args’参数利用漏洞执行任意命令。
CVE-2020-7596 MPS-2020-1229
2022-08-08 20:23
url-parse 安全漏洞
Arnout Kazemier url-parse是美国Arnout Kazemiere(Arnout Kazemier)个人开发者的一个应用软件。提供url解析。 url-parse before 1.5.0 版本存在安全漏洞,该漏洞源于错误处理了反斜杠的某些用法,例如http: /,并将URI解释为相对路径。
CVE-2021-27515 MPS-2021-2265
2022-08-08 20:23
tar 存在拒绝服务漏洞
拒绝服务
tar 是用于 Node.js 的全功能 Tar。此软件包的受影响版本容易受到正则表达式拒绝服务 (ReDoS) 的攻击。
MPS-2022-14081
2022-08-08 20:23
Digital Bazaar Forge数据伪造问题漏洞
密码学签名的验证不恰当
Digital Bazaar Forge是美国Digital Bazaar公司的一个Tls在Javascript中的本机实现以及用于编写基于加密和网络密集型Web应用程序的开源工具。Digital Bazaar Forge1.3.0之前版本存在数据伪造问题漏洞,该漏洞源于SA PKCS#1 v1.5签名验证码无法正确检查DigestInfo以获得正确的 ASN.1 结构。攻击者可以发送特殊的签名利用该漏洞以验证包含无效结构但有效摘要的签名。
CVE-2022-24773 MPS-2022-3740
2022-08-08 20:23
Digital Bazaar Forge数据伪造问题漏洞
密码学签名的验证不恰当
Digital Bazaar Forge是美国Digital Bazaar公司的一个Tls在Javascript中的本机实现以及用于编写基于加密和网络密集型Web应用程序的开源工具。digitalbazaar Forge 1.3.0之前版本存在数据伪造问题漏洞,该漏洞源于RSA PKCS#1 v1.5签名验证码在解码 `DigestInfo` ASN.1 结构后不检查尾随垃圾字节。攻击者可以删除填充字节利用该漏洞添加垃圾数据以伪造签名。
CVE-2022-24772 MPS-2022-3739
2022-08-08 20:23
NPM url-parse授权绕过漏洞
Url-Parse是一个跨Node.js和浏览器环境无缝工作的小型Url解析器。NPM url-parse 1.5.8之前版本存在授权绕过漏洞,攻击者可利用该漏洞通过用户控制的密钥绕过授权。
CVE-2022-0686 MPS-2022-4464
2022-08-08 20:23
set-value 资源管理错误漏洞
拒绝服务
set-value是一款能够使用点表示法在对象上设置嵌套值的模块。 set-value 3.0.1之前版本中存在资源管理错误漏洞。该漏洞源于网络系统或产品对系统资源(如内存、磁盘空间、文件等)的管理不当。
CVE-2019-10747 MPS-2019-10508
2022-08-08 20:23
lodash 资源管理错误漏洞
不加限制或调节的资源分配
lodash是一款开源的JavaScript实用程序库。 lodash 4.7.11之前版本中的Date handler存在资源管理错误漏洞。该漏洞源于网络系统或产品对系统资源(如内存、磁盘空间、文件等)的管理不当。
CVE-2019-1010266 MPS-2019-8123
2022-08-08 20:23
grpc 注入漏洞
注入
grpc是云原生计算(Cloud Native Computing Foundation)基金会的一个应用于rpc连接的代码库。 grpc 1.24.4之前版本存在安全漏洞,该漏洞源于@grpc grpc-js容易受到loadPackageDefinition的原型污染。
CVE-2020-7768 MPS-2020-15701
2022-08-08 20:23
ua-parser-js 资源管理错误漏洞
拒绝服务
ua-parser-js是基于JavaScript的User-Agent字符串解析器。可以在浏览器(客户端)或node.js(服务器端)环境中使用。也可以作为jQuery / Zepto插件,Bower / Meteor软件包和RequireJS / AMD模块使用。 ua-parser-js 0.7.23 之前版本存在安全漏洞,该漏洞源于ue -parser-js很容易受到正则表达式在多个正则表达式中的拒绝服务(ReDoS)的攻击。
CVE-2020-7793 MPS-2020-17428
2022-08-08 20:23
Moment.js 正则拒绝服务漏洞
拒绝服务
Moment.js 是一个 JavaScript 日期库。用于解析、验证、操作和格式化日期。 Moment.js 在处理嵌套 rfc2822 注释内容时正则表达式执行时间不断的指数增大,导致服务不可用。 攻击者可利用该漏洞使目标服务停止响应甚至崩溃。
CVE-2022-31129 MPS-2022-11159
2022-08-08 20:23
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
0 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部