为啥我的 graphql apollo 解析器没有被调用?

Posted

技术标签:

【中文标题】为啥我的 graphql apollo 解析器没有被调用?【英文标题】:Why is my graphql apollo resolver not being called?为什么我的 graphql apollo 解析器没有被调用? 【发布时间】:2021-03-21 10:21:27 【问题描述】:

我对 graphql(和 nodejs 也是)很陌生。我正在关注Udemy course on Apollo and mongo,大部分情况下进展顺利。但是,我无法调用其中一个解析器。另一个解析器工作正常,它们似乎使用相同的布局。此外,上下文是在没有被调用的解析器之前调用的,所以我知道它至少已经走到了那一步。

这是带有工作上下文的根server.js

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/index.js 中组合在一起,这里:

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

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

const customDateScalarResolver = 
    Date: GraphQLDateTime


module.exports = [
    userResolver, 
    taskResolver,
    customDateScalarResolver
]

这里是任务解析器,位于/resolvers/task.js,它是未被调用的:

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

当我运行任务查询时,上下文设置函数中的 console.log 会记录 3 次,但不会从任务解析器中记录 console.log 行。它似乎也根本不回来。我只是使用默认的 graphiql Web 客户端。 verifyUser() 确实找到了一个返回用户,所以我知道数据库连接工作正常。

【问题讨论】:

【参考方案1】:

mergeResolvers 应该用于合并解析器。

它旨在合并不同的[实体]对象[/结构化]解析器,然后在服务器[配置]中使用[作为一棵树结构]。

F.e.它分别[按类型]合并/组合来自users解析器的Query解析器与tasksQuery解析器...和来自users解析器的Mutation解析器与tasksMutation解析器。

【讨论】:

以上是关于为啥我的 graphql apollo 解析器没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 字段的解析器没有被调用

合并 Apollo 服务器的 GraphQL 解析器不使用 Object.assign()

Apollo GraphQL - 未触发解析器

Apollo Server v2 - 未调用 GraphQL 解析器

上下文未传递给嵌套的 Apollo GraphQL 解析器

如何在 Apollo GraphQL Server 中添加字段解析器