0
votes

I'm pretty new to graphql (and nodejs as well). I'm following a Udemy course on Apollo and mongo which has been going well mostly. However I can't get one of the resolvers to be called. Another resolver is working fine, and they appear to use the same layout. Also, the context is being called before the resolver that is not being called, so I know it's at least getting that far.

Here is the root server.js with the working context:

const resolvers = require('./resolvers');

...

const apolloServer = new ApolloServer({
    typeDefs,
    resolvers,
    context: async ({ req }) => {
        await verifyUser(req);
        console.log("=== context ran, user email : ", req.email) ;
        return {
            email: req.email,
            loggedInUserId: req.loggedInUserId
        }
    }
});

resolvers are modularized, and combined in a /resolvers/index.js, here:

const { GraphQLDateTime } = require('graphql-iso-date')

const userResolver = require('./user');
const taskResolver = require('./task');

const customDateScalarResolver = {
    Date: GraphQLDateTime
}

module.exports = [
    userResolver, 
    taskResolver,
    customDateScalarResolver
]

and here is the tasks resolver, located at /resolvers/task.js, which is the one not being called:

const uuid = require('uuid')
const { combineResolvers } = require('graphql-resolvers');

const { users, tasks } = require('../constants');
const Task = require('../database/models/task');
const User = require('../database/models/user');
const { isAuthenticated, isTaskOwner } = require('./middleware');

module.exports = {
    Query: {
        tasks: async ( _, __, { loggedInUserId }) => {
            console.log("tasks query, loggedInUserId : ", loggedInUserId);
            try {
                const tasks = await Task.find( { user: loggedInUserId });
                return tasks;                
            } catch (error) {
                console.log(error);
                throw error;
            }
        },
        task: async ( parent, { id }, ) => {
            console.log("taskbyId query, id : ", id);
            // tasks.find(task => task.id == args.id);
            try {
                const task = await Task.findById(id);
                console.log("taskById query, found task? : ", task);
                return task;
            } catch (error) {
                console.log(error);
                throw error;
            }
        },
    },
    Mutation: {
        // createTask: combineResolvers(isAuthenticated, async (_, { input }, { email }) => {
        createTask: async (_, { input }, { email }) => {
            try {
                console.log("creating task, email : ", email);
                const user = await User.findOne({ email });
                const task = new Task({ ...input, user: user.id });
                const result = await task.save();
                user.tasks.push(result.id);
                await user.save();
                return result;
            } catch (error) {
                console.log(error);
                throw error;
            }
        }
        // )
    },
    Task: {
        user: async ( parent ) => {
            console.log("in task.user field resolver");
            try {
                const user = await User.findById(parent.user);
                return user;
            } catch (error) {
                console.log(error);
                throw error;
            }
        }
    },
}

When I run the tasks query, the console.log from the context setup function logs 3 times, but does NOT log the console.log line from the tasks resolver. It also appears to not return at all. I'm just using the default graphiql web client. The verifyUser() does find a return a user, so I know the db connection is working fine as well.

1

1 Answers

0
votes

mergeResolvers should be used to merge resolvers.

It's designed to merge different [entities] object [/structured] resolvers before use [as one tree structured] in server [config].

F.e. it merges/combines respectively [by type] Query resolvers from users resolver with tasks Query resolvers ... and Mutation resolvers from users resolver with tasks Mutation resolvers.