Apollo
简介
Apollo 是一个用于传输数据的 GraphQL 客户端/服务器。虽然它还没有 Meteor 的发布/订阅系统的所有功能,但它提供了一种从任何数据库获取数据的方式——而不仅仅是 MongoDB。
您可以使用 Apollo 骨架创建一个新的 Meteor 应用,从而开始使用 Apollo 和 Meteor。
meteor create apollo-app --apollo
Apollo 客户端
获取数据
您将使用 查询 来获取数据,而不是调用 Meteor.subscribe
。
与订阅的主要区别在于,查询仅调用一次(默认情况下),并且不会像订阅那样更新数据。这非常适合于不经常更改的数据以及不需要反应性的数据。
更改数据
您将使用名为 mutate
的函数来运行一个变异器(它是 GraphQL 中方法的等价物),而不是使用 Meteor.call
调用 Meteor 方法。
变异器仅在服务器上运行,但它们可以返回一个对象,然后该对象可以在无需再次调用查询的情况下更新本地缓存。
Apollo 服务器
获取数据
您将编写 解析函数(称为解析器)来获取查询中不同类型的数据,而不是使用 Meteor.publish
定义发布。
更改数据
您将编写 变异器(用于修改数据的函数),而不是使用 Meteor.methods
定义方法。
这些是 Mutation
键下解析函数的一部分。
GraphQL
GraphQL 是一种查询语言,用于应用程序获取它们想要的数据。客户端使用 GraphQL 精确地指定其想要哪些对象的哪些字段,而不是服务器决定发布内容。
高级
延迟
Meteor 发布默认情况下是阻塞的,而多个 GraphQL 查询是并行执行的。发布在数据到达时将其流式传输到客户端,而 GraphQL 查询中的所有解析器都必须在数据发送到客户端之前返回。(尽管 GraphQL 正在讨论添加在结果到达时将其流式传输到客户端的功能。)
Meteor 特定
Meteor 有一个特定的 Apollo 包,它将用户对象包含到查询的上下文中。
meteor add apollo
在服务器上,您导入 getUser
函数,并在设置 Apollo 服务器时将其包含到上下文选项中。
import { ApolloServer } from '@apollo/server';
import { WebApp } from 'meteor/webapp';
import { getUser } from 'meteor/apollo';
import typeDefs from '/imports/apollo/schema.graphql';
import { resolvers } from '/server/resolvers';
import express from 'express';
import { expressMiddleware } from '@apollo/server/express4';
import { json } from 'body-parser'
const context = async ({ req }) => ({
user: await getUser(req.headers.authorization)
})
const server = new ApolloServer({
cache: 'bounded',
typeDefs,
resolvers,
});
export async function startApolloServer() {
await server.start();
WebApp.connectHandlers.use(
'/graphql', // Configure the path as you want.
express() // Create new Express router.
.disable('etag') // We don't server GET requests, so there's no need for that.
.disable('x-powered-by') // A small safety measure.
.use(json()) // From `body-parser`.
.use(expressMiddleware(server, { context })), // From `@apollo/server/express4`.
)
}
这将使用户数据(如果用户已登录)作为查询中的选项可用。
{
Query: {
userUniverses: async (obj, { hideOrgs }, { user }) => {
if (!user) return null
const selector = { userId: user._id, }
if (hideOrgs) selector.organizationId = { $exists: false }
return UniversesCollection.find(selector).fetch()
}
}
}
还有许多其他社区包提供了额外的功能或使初始设置更容易,以下是一些不完整的列表:
- quave:graphql - 用于以标准方式创建 GraphQL 设置的实用程序包。
- cultofcoders:apollo - Meteor 和 Apollo 集成。
- cultofcoders:graphql-loader - 在 Meteor 应用中轻松加载 GraphQL 模式!
- cultofcoders:apollo-accounts - GraphQL 中的 Meteor 账户。
- swydo:blaze-apollo - Apollo 客户端的 Blaze 集成。
- swydo:ddp-apollo - Apollo 的 DDP 链接和服务器。