Search code examples
javascriptnode.jsgraphqlapollo-server

Cannot read property 'fetch' of undefined


I am trying to add a REST datasource to my Apollo Server. I created a class which extends RESTDataSource which contains all the API requests. When trying to call the login method from my GraphQL resolver code the error is thrown

How can I fix this?

I already tried: Binding the login and fetch method in the API class constructor

this.login = this.login.bind(this); this.fetch = this.fetch.bind(this);

calling the login method from the constructor

RESTDataSource class

class API extends RESTDataSource {
        constructor() {
            super();
            this.baseURL = URL;

            this.login = this.login.bind(this);
            this.fetch = this.fetch.bind(this);
            console.log(this.fetch);
            console.log(this.login);

        }
        initialize(config) {
            //config can store different information
            //the current user can be stored in config.context for easy  access
            this.context = config.context;

        }

        async login(username, password) {
            return this.post(`/`, {
                "id": 1
            }, {
                "method": "authenticate"
            }, {
                params: {
                    "user": username,
                    "password": password
                },
                "jsonrpc": "2.0"
            })
        }
    }

Here's the index.js apollo server 'setup' file:

const server = new ApolloServer({
    typeDefs,
    resolvers,
    dataSources: () => {
        return {
            managementDatabase: new ManagementDatabase(),
            API: new API() //was previously imported
        }
    }
});




server.listen().then(({
    url
}) => {
    log(`🚀  Server ready at ${url}`)
})

Resolver file for GraphQL:

Query: {
        lessons: async (_source, _args, {
            dataSources
        }) => {
            const data = await dataSources.webuntisAPI.login(process.env.USER, process.env.PW);
            console.log(data);
            return data;
        }
}

Solution

  • Solved the issue. The problem was the method initalize(config) which is unnecessary in this case. So to fix the issue, just remove the initalize method from your code