简体   繁体   中英

Graphql query is always returning null

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在此处输入图片说明

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

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

Eg

//...

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,
};

//...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM