Graphql query is always returning null

580 views Asked by At

I am trying to get course data using graphql, but server is always returning null as a response This is my code in file server.js :

var express=require('express');
const { graphqlHTTP } = require('express-graphql')
var {buildSchema}=require('graphql');

//graphql schema
var schema=buildSchema(`
type Query {
    course(id: Int!): Course
    courses(topic:String!):[Course]

}
type Course {
    id: Int
    title: String
    author: String
    description:String
    topic:String
    url: String
}
`);

var coursesData = [
    {
        id: 1,
        title: 'The Complete Node.js Developer Course',
        author: 'Andrew Mead, Rob Percival',
        description: 'Learn Node.js by building real-world applications with Node, Express, MongoDB, Mocha, and more!',
        topic: 'Node.js',
        url: 'https://codingthesmartway.com/courses/nodejs/'
    },
    {
        id: 2,
        title: 'Node.js, Express & MongoDB Dev to Deployment',
        author: 'Brad Traversy',
        description: 'Learn by example building & deploying real-world Node.js applications from absolute scratch',
        topic: 'Node.js',
        url: 'https://codingthesmartway.com/courses/nodejs-express-mongodb/'
    },
    {
        id: 3,
        title: 'JavaScript: Understanding The Weird Parts',
        author: 'Anthony Alicea',
        description: 'An advanced JavaScript course for everyone! Scope, closures, prototypes, this, build your own framework, and more.',
        topic: 'JavaScript',
        url: 'https://codingthesmartway.com/courses/understand-javascript/'
    }
]

//root resolver
var root= {
    course:getCourse,
    courses:getCourses
};


var getCourse= function (args){
    var id=args.id;
    console.log("delila")
    return coursesData.filter(course=>{
        return course.id==id
    })[0]

}
var getCourses = function(args){
    if(args.topic){
        var topic=args.topic;
        return coursesData.filter(course=>
            course.topic===topic
        );

    }
    else return coursesData
    
}
//create an experess server and graphql endpoint
var app=express();
app.use('/graphql', graphqlHTTP({
    schema: schema,
    rootValue:root,
    graphiql:true
}));
app.listen(4000,()=>console.log("delila express graphql server running on localhost 4000"))

When I go to localhost:4000/graphql to get data I am using

query getSingleCourse($courseID: Int !){
  course(id:$courseID){
    title
    author
    description
    url
    topic
  }
}

{
  "courseID": 3
}

But I am constantly getting result null. Look at image enter image description here

Anyone idea why is happening this? Server should return course with id 3 but obviously there is something that I am missing

1

There are 1 answers

0
Lin Du On BEST ANSWER

You should define function expression first and then use them. That's the reason.

Function expressions in JavaScript are not hoisted, unlike function declarations. You can't use function expressions before you create them:

See Function expression

E.g.

//...

var getCourse = function (args) {
  var id = args.id;
  console.log('delila');
  return coursesData.filter((course) => {
    return course.id == id;
  })[0];
};
var getCourses = function (args) {
  if (args.topic) {
    var topic = args.topic;
    return coursesData.filter((course) => course.topic === topic);
  } else return coursesData;
};

//root resolver
var root = {
  course: getCourse,
  courses: getCourses,
};

//...