看到此documentation之后,我不确定是否像其他时候一样使用简单的上下文,还是最好使用dataSources处理数据库。
DataSource是与数据库通信的正确方法,还是最好仅将其与REST API进行通信?
基本上,在这种情况下使用dataSources和context有什么优势吗?
答案 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
。
Apollo尚不支持SQL数据源(尽管如果您有兴趣提供帮助,我们很乐意帮助您),因此我们需要通过扩展数据库来为数据库创建自定义数据源。通用Apollo数据源类。您可以使用
apollo-datasource
包创建自己的包。以下是创建自己的数据源的一些核心概念:
- initialize方法:如果要将任何配置选项传递给类,则需要实现此方法。在这里,我们正在使用这种方法来访问图形API的上下文。
- this.context:图形API的上下文是在GraphQL请求中的每个解析器之间共享的对象。我们将在下一节中更详细地说明这一点。现在,您需要知道的是上下文对于存储用户信息很有用。
- 缓存:尽管REST数据源带有其自己的内置缓存,但通用数据源却没有。但是,您可以使用我们的缓存原语来构建自己的缓存!
答案 2 :(得分:0)
我通常保持解析器非常薄,将传入的args传递到dataSources,它们使模型和加载器进行通信。大多数逻辑和验证都在模型中。您当然可以制定自己的规则,例如“不要在数据源中调用另一个数据源。传递其输出以使它们通过解析器进行通信”等。这仅是示例。我没有严格的规定。 可能会有更好的解决方案,实际上对于简单的事情,直接使用模型要简单得多。但是dataSources可以帮助您保持事物的井井有条,如果您想添加缓存等,则可以创建BaseDataSource,将所有逻辑放入其中,然后将其与其他dataSources一起扩展。