Apollo Server:dataSources vs context 与数据库一起使用
Posted
技术标签:
【中文标题】Apollo Server:dataSources vs context 与数据库一起使用【英文标题】:Apollo Server: dataSources vs context to use it with database 【发布时间】:2019-05-29 10:58:30 【问题描述】:看到这个documentation之后,我不确定是使用简单的上下文,就像我在其他时候所做的那样,还是使用 dataSources 来处理数据库更好。
DataSource 是与数据库通信的正确方法,还是仅用于与 REST API 通信更好?
基本上,在这种情况下使用 dataSources vs context 有什么优势吗?
【问题讨论】:
【参考方案1】:我认为最好使用 DataSource(顾名思义),并且在其上添加缓存层可能很容易。您可以创建一个 DBDataSource
类来扩展 DataSource
类,因为 Apollo 不提供任何 DBDataSource
类。
DataSource
类是通用 Apollo 数据源类,而 RESTDataSource
类负责从 REST API 获取数据。
所以要从其他 API 中获取数据,最好使用 RESTDataSource
。
Build a custom data source
Apollo 尚不支持 SQL 数据源(尽管如果您有兴趣提供帮助,我们很乐意为您提供指导),因此我们需要通过扩展通用 Apollo 数据源类。您可以使用
apollo-datasource
包创建自己的。以下是创建您自己的数据源的一些核心概念:
initialize 方法:如果您想将任何配置选项传递给您的类,则需要实现此方法。在这里,我们使用此方法来访问我们的图形 API 的上下文。 this.context:图形 API 的上下文是在 GraphQL 请求中的每个解析器之间共享的对象。我们将在下一节中更详细地解释这一点。现在,您只需要知道上下文对于存储用户信息很有用。 缓存:虽然 REST 数据源带有自己的内置缓存,但通用数据源没有。不过,您可以使用我们的缓存原语来构建自己的缓存原语!
【讨论】:
【参考方案2】:我通常保持解析器非常精简,将传入的参数传递给数据源,它们使模型和加载器进行通信。大多数逻辑和验证都在模型中。您当然可以制定自己的规则,例如“不要在数据源中调用另一个数据源。传递它们的输出以使它们通过解析器进行通信”等。这当然只是一个示例。我遵循的不是严格的规则。 可能有更好的解决方案,实际上对于简单的事情,直接使用模型要简单得多。但是数据源可以帮助您保持井井有条,如果您想添加缓存等,您可以创建一个 BaseDataSource,将所有逻辑放入其中,然后使用其他数据源进行扩展。
【讨论】:
【参考方案3】:如果您查看您指出的documentation。在初始化 Apollo Server 时添加数据源,如下所示:
const server = new ApolloServer(
typeDefs,
dataSources: () => (
launchAPI: new LaunchAPI(),
userAPI: new UserAPI( store )
)
);
正是因为这个数据源成为了上下文的一部分。如果你记得你做了上下文的解构以暴露数据源,如图所示here
module.exports =
Query:
launches: (_, __, dataSources ) =>
dataSources.launchAPI.getAllLaunches(),
launch: (_, id , dataSources ) =>
dataSources.launchAPI.getLaunchById( launchId: id ),
me: (_, __, dataSources ) => dataSources.userAPI.findOrCreateUser()
;
如果您想访问诸如 UserAPI 或 LaunchAPI 之类的数据源实例,则必须使用 dataSources.userAPI
进行此操作
【讨论】:
以上是关于Apollo Server:dataSources vs context 与数据库一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Apollo Server:dataSources vs context 与数据库一起使用
获取 apollo-rest-datasource 发布请求的 Response-Body
使用 apollo-datasource-rest 库将 Content-Type 标头设置为 application/x-www-form-urlencoded
[Apollo Server] Get started with Apollo Server