为啥我的 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
解析器与tasks
Query
解析器...和来自users
解析器的Mutation
解析器与tasks
Mutation
解析器。
【讨论】:
以上是关于为啥我的 graphql apollo 解析器没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章
合并 Apollo 服务器的 GraphQL 解析器不使用 Object.assign()