Resolver is a collection of functions that generate response for a GraphQL query. In simple terms, a resolver acts as a GraphQL query handler. Every resolver function in a GraphQL schema accepts four positional arguments as given below −
fieldName:(root, args, context, info) => { result }
An example of resolver functions is shown below −
//resolver function with no parameters and returning string greeting:() => { return "hello from Howcodex !!!" } //resolver function with no parameters and returning list students:() => db.students.list() //resolver function with arguments and returning object studentById:(root,args,context,info) => { return db.students.get(args.id); }
Given below are the positional arguments and their description −
Sr.No. | Arguments & Description |
---|---|
1 | root The object that contains the result returned from the resolver on the parent field. |
2 | args An object with the arguments passed into the field in the query. |
3 | context This is an object shared by all resolvers in a particular query. |
4 | info It contains information about the execution state of the query, including the field name, path to the field from the root. |
Resolvers in GraphQL can return different types of values as given below −
Sr.No. | Arguments and Description |
---|---|
1 | null or undefined this indicates the object could not be found |
2 | array this is only valid if the schema indicates that the result of a field should be a list |
3 | promise resolvers often do asynchronous actions like fetching from a database or backend API, so they can return promises |
4 | scalar or object a resolver can also return other values |
Let us create a simple application to understand resolver. This will create schema for querying a student by id from the server. The student data will be stored in a flat file and we will use a node module called notarealdb to fake a database and read from flat file.
The following is a step-wise process to create a simple application −
Create a folder named resolver-app. Change your directory to resolver-app from the terminal. Later, follow steps 3 to 5 in the Environment Setup chapter.
Add schema.graphql file in the project folder resolver-app and add the following code −
type Query { greeting:String students:[Student] studentById(id:ID!):Student } type Student { id:ID! firstName:String lastName:String password:String collegeId:String }
The schema file shows that user can query for greeting, students and studentById. To retrieve students with specific id, we use data type ID! which shows a non nullable unique identifier field. The students field returns an array of students, and greeting returns a simple string value.
Create a file resolvers.js in the project folder and add the following code −
const db = require('./db') const Query = { //resolver function for greeting greeting:() => { return "hello from Howcodex !!!" }, //resolver function for students returns list students:() => db.students.list(), //resolver function for studentbyId studentById:(root,args,context,info) => { //args will contain parameter passed in query return db.students.get(args.id); } } module.exports = {Query}
Here, studentById takes in three parameters. As discussed in this chapter, the studentId can be retrieved from args; root will contain the Query object itself. To return a specific student, we need to call get method with id parameter in the students collection.
Here greeting, students, studentById are the resolvers that handle the query. students resolver function returns a list of students from the data access layer. To access resolver functions outside the module, Query object has to be exported using module.exports.
Create a server.js file. Refer step 8 in the Environment Setup Chapter. Execute the command npm start in the terminal. The server will be up and running on 9000 port. Here, we use GraphiQL as a client to test the application.
Open the browser and enter the url, http://localhost:9000/graphiql. Type the following query in the editor −
{ studentById(id:"S1001") { id firstName lastName } }
The output for the above query is as shown below −
{ "data": { "studentById": { "id": "S1001", "firstName": "Mohtashim", "lastName": "Mohammad" } } }