Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apollo Server: dataSources vs context to use it with database

After see this documentation I'm not sure if to use a simple context, as I has done other times, or if it is better to use dataSources to handle the database.

DataSource is the correct way to comunicate with the database or it is better use it only to comunicate with a REST API?

Basically, does it have any advantage to use dataSources vs context in this case?

like image 796
alexojegu Avatar asked Jan 02 '19 19:01

alexojegu


People also ask

Can GraphQL connect to database?

Your GraphQL API can interact with any combination of data sources. Apollo provides a DataSource class that we can extend to handle interaction logic for a particular type of data source. In this section, we'll extend DataSource to connect both a REST API and a SQL database to Apollo Server.

Which of the following is a reason why we might want to use resolver chains in our GraphQL API?

We want to be able to query the user field to fetch a user by its id .

What database does GraphQL use?

GraphQL is often confused with being a database technology. This is a misconception, GraphQL is a query language for APIs - not databases. In that sense it's database agnostic and can be used with any kind of database or even no database at all.

How do you use context in GraphQL?

In GraphQL, a context is an object shared by all the resolvers of a specific execution. It's useful for keeping data such as authentication info, the current user, database connection, data sources and other things you need for running your business logic.


2 Answers

I think it's better to go with DataSource (as the name suggests) and it might be easy to add a caching layer on top of it. You can create a DBDataSource class extending the DataSource class since Apollo doesn't provide any DBDataSource class.

DataSource class is a generic Apollo data source class whereas RESTDataSource class that is responsible for fetching data from a REST API.

So to fetch data from rest APIs it's better to go with RESTDataSource.

Build a custom data source

Apollo doesn't have support for a SQL data source yet (although we'd love to help guide you if you're interested in contributing), so we will need to create a custom data source for our database by extending the generic Apollo data source class. You can create your own with the apollo-datasource package.

Here are some of the core concepts for creating your own data source:

  1. The initialize method: You'll need to implement this method if you want to pass in any configuration options to your class. Here, we're using this method to access our graph API's context.
  2. this.context: A graph API's context is an object that's shared among every resolver in a GraphQL request. We're going to explain this in more detail in the next section. Right now, all you need to know is that the context is useful for storing user information.
  3. Caching: While the REST data source comes with its own built-in cache, the generic data source does not. You can use our cache primitives to build your own, however!
like image 153
Abhishek Avatar answered Sep 28 '22 15:09

Abhishek


I generally keep resolvers very thin, pass the incoming args to dataSources and they make models and loaders communicate. Most of the logic and validations are in models. You may of course make your own rules like "don't call another dataSource inside a dataSource. Pass their outpus to make them communicate through resolvers" etc. This is only an example of course. Not a strict rule I follow. There may be better solutions and actually for simple things, using models directly is much more straightforward. But dataSources help you keep things organised and if you want to add caching etc, you can create a BaseDataSource, put all the logic in that and just extend it with other dataSources.

like image 36
Onur Önder Avatar answered Sep 28 '22 13:09

Onur Önder