Firebase&;图形ql

Firebase&;图形ql,firebase,firebase-realtime-database,graphql,graphql-js,Firebase,Firebase Realtime Database,Graphql,Graphql Js,有人有GraphQL和Firebase的经验吗? 我认为可以将firebase调用放在相关字段的解析器中,将一些变量从组件的props传递到查询的参数中 如何使用GraphQL在Firebase中插入新数据?您必须使用Firebase吗?有一些特定于GraphQL的服务可以提供您所需要的。是一家YC联谊会公司,看起来特别有前途,给你一个firebase般的体验,但它是由GraphQL提供动力的 TL;DR:GraphQL在Firebase不足的地方发光。强大的数据建模、灵活高效的查询和开放规范都

有人有GraphQL和Firebase的经验吗? 我认为可以将firebase调用放在相关字段的解析器中,将一些变量从组件的props传递到查询的参数中


如何使用GraphQL在Firebase中插入新数据?

您必须使用Firebase吗?有一些特定于GraphQL的服务可以提供您所需要的。是一家YC联谊会公司,看起来特别有前途,给你一个firebase般的体验,但它是由GraphQL提供动力的

TL;DR:GraphQL在Firebase不足的地方发光。强大的数据建模、灵活高效的查询和开放规范都是Firebase所缺乏的GraphQL的基本部分

强大的数据建模 基于有限的数据建模,Firebase受到了很多批评。基本上,您的数据被构造为一个巨大的JSON,多次声明相同的数据。当您需要更新数据时,一开始看似方便的操作会导致无法管理的客户端代码,因为您必须手动跟踪对相同数据的所有引用

另一方面,GraphQL中使用的数据结构非常直观,并且非常熟悉,因为它是作为一个图形建模的。通过使用,我们可以很容易地描述我们的数据模型,称为GraphQL模式。对于Twitter应用程序,模式可能如下所示:

type Tweet {
  id: ID!
  title: String!
  author: User! @relation(name: "Tweets")
}

type User {
  id: ID!
  name: String!
  tweets: [Tweet!]! @relation(name: "Tweets")
}
在这里,我们定义了两种类型
Tweet
User
,它们具有一些标量属性,并且
User
Tweet
之间存在一对多关系。单个数据项被称为节点,一个用户节点可以连接到多个tweet节点。这种数据结构既简单又灵活,不同于Firebase的JSON方法

灵活高效的查询 GraphQL灵活的查询功能是其主要优点之一。查询是分层的,这意味着您可以指定反映图形结构的数据需求。在我们的Twitter示例中,我们可能有一个查询来获取所有用户及其推文:

query {
  allUsers {
    id
    name
    tweets {
      title
    }
  }
}
请注意,我们可以自由地包含或省略要查询的字段,甚至可以跨关系查询。这意味着我们既不需要执行多个查询,也不需要查询不需要的数据,这使得GraphQL查询非常高效

将查询参数添加到混合中,我们可以添加诸如自定义顺序或过滤器之类的功能来获得

所有这些都是Firebase无法做到的

实时数据 Firebase的实时功能使它如此受欢迎,但由于GraphQL社区即将进入,Firebase的最大优势也随之消失。我建议使用GraphQL订阅来更好地理解底层概念

结论 因此,回答您的问题:GraphQL在大多数方面都优于Firebase,因此成为首选

如果您对GraphQL感兴趣,我建议您看看它将GraphQL的优点与强大功能(如内置身份验证和灵活的钩子)结合起来,或者使用其他无服务器功能来实现自定义业务逻辑


免责声明:我在GraphTool工作:)

要回答您的问题,有三种方法可以解决这个问题

1.Firebase和GraphQL 如果您打算使用Firebase,那么可以将Firebase的API一对一映射到GraphQL查询和变体中

您当然可以将Firebase API封装到GraphQL解析器中,并以这种方式进行调用:

本质上,您在这里所做的是使用Firebase作为数据库,它一直工作到您想在解析器中以关系方式查询数据为止。如果不能在数据存储上的服务器端执行连接,您将在解析程序中向Firebase发出大量的往返请求,以满足单个请求

大多数人使用Firebase的原因是它的实时功能,而不仅仅是作为数据存储,因为这方面的数据关系建模工具相当缺乏。这样,您可能最好使用不同的数据源迁移到GraphQL

2.GraphQL后端即服务 <> P>考虑到你喜欢使用Firebase之类的BAAS产品,你可以考虑切换到图形化的BAAS。

3.自托管GraphQL 如果您愿意使用自己的数据存储转换为自托管解决方案,那么这也有很多好处。以下是几个大的打击者:

  • 灵活使用您自己的数据存储区,可能还有多个数据存储区,以满足您特定应用程序的需求

  • 自定义查询和转换

  • 本机添加自定义逻辑,而不是通过连接到API中Webhook的微服务

  • 滚动您自己的身份验证和许可机制

  • 可能是成本更低的解决方案


您可以在本地使用graphql和firebase。所有繁重的工作都可以在webworker中完成,以避免在解决请求时阻塞UI

有一句话是关于“解决请求所需的许多往返”:如果您不介意传输的数据,那也没什么大不了的,因为所有的“往返”都合并在同一个套接字框架中。但是,如果您确实想避免大帧,您只需在firebase数据库前面放置一点
dataloader

对于实时更新,您只需从firebase订阅实时事件并将其发送给webworker,以将其转换为可通过模式解析的真实graphql订阅

你可以在我的中篇文章中找到关于这个问题的更多信息:


希望有帮助

我强烈反对这里的一些建议。GraphQL可以以关系方式使用,但也可以以NoSQL方式使用。Firebase及其RTD(实时数据库)和F
const ref = path => firebase.database().ref(path)
const getValue = path => ref(path).once('value')
const mapSnapshotToEntities = snapshot => snapshot.val().map((value, id) => ({ id, ...value }))
const getEntities = path => getValue(path).then(mapSnapshotToEntities)

const resolvers = {
    Author: {
        posts(author) {
            return getEntities('posts').then(posts => filter(posts, { authorId: author.id }))
        },
    },

    Post: {
        author(post) {
            return getEntities('authors').then(posts => filter(authors, { id: authorId }))
        },
    },
};