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

使用“apollo-server-azure-functions”的 Apollo 订阅

Apollo-Server,如何与 SailsJS 一起使用?