Apollo Server:dataSources与上下文结合使用以与数据库一起使用

时间:2019-01-02 19:56:08

标签: apollo-server

看到此documentation之后,我不确定是否像其他时候一样使用简单的上下文,还是最好使用dataSources处理数据库。

DataSource是与数据库通信的正确方法,还是最好仅将其与REST API进行通信?

基本上,在这种情况下使用dataSources和context有什么优势吗?

3 个答案:

答案 0 :(得分:0)

如果您查看您指出的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

答案 1 :(得分:0)

我认为最好使用DataSource(顾名思义),并且在其顶部添加缓存层可能很容易。您可以创建扩展DBDataSource类的DataSource类,因为Apollo不提供任何DBDataSource类。

DataSource类是通用的Apollo数据源类,而RESTDataSource类则负责从REST API中获取数据。

因此,要从其余API获取数据,最好使用RESTDataSource

  

Build a custom data source

     

Apollo尚不支持SQL数据源(尽管如果您有兴趣提供帮助,我们很乐意帮助您),因此我们需要通过扩展数据库来为数据库创建自定义数据源。通用Apollo数据源类。您可以使用apollo-datasource包创建自己的包。

     

以下是创建自己的数据源的一些核心概念:

     
      
  1. initialize方法:如果要将任何配置选项传递给类,则需要实现此方法。在这里,我们正在使用这种方法来访问图形API的上下文。
  2.   
  3. this.context:图形API的上下文是在GraphQL请求中的每个解析器之间共享的对象。我们将在下一节中更详细地说明这一点。现在,您需要知道的是上下文对于存储用户信息很有用。
  4.   
  5. 缓存:尽管REST数据源带有其自己的内置缓存,但通用数据源却没有。但是,您可以使用我们的缓存原语来构建自己的缓存!
  6.   

答案 2 :(得分:0)

我通常保持解析器非常薄,将传入的args传递到dataSources,它们使模型和加载器进行通信。大多数逻辑和验证都在模型中。您当然可以制定自己的规则,例如“不要在数据源中调用另一个数据源。传递其输出以使它们通过解析器进行通信”等。这仅是示例。我没有严格的规定。 可能会有更好的解决方案,实际上对于简单的事情,直接使用模型要简单得多。但是dataSources可以帮助您保持事物的井井有条,如果您想添加缓存等,则可以创建BaseDataSource,将所有逻辑放入其中,然后将其与其他dataSources一起扩展。