搭建Apollo Server时遇ReferenceError: parent is not defined错误求助
Apollo Server 报错:
ReferenceError: parent is not defined 解决方法 问题场景
搭建Apollo Server时出现报错:ReferenceError: parent is not defined,相关代码如下:
import { User, Landing, Category } from './resolvers'; export const resolves = { Query: { UserDelete: User.UserDelete(parent, args), UserAuth: User.UserAuth(parent, args), UserView: User.UserView(parent, args), UserLandings: User.UserLandings(parent, args), CategoriesView: Category.CategoriesView(parent, args), CategoryView: Category.CategoryView(parent, args), CategoryDelete: Category.CategoryDelete(parent, args), LandingDelete: Landing.LandingDelete(parent, args), LandingUp: Landing.LandingUp(parent, args), LandingDown: Landing.LandingDown(parent, args), LandingView: Landing.LandingView(parent, args), LandingsView: Landing.LandingsView(parent, args), }, Mutation: { UserRegister: User.UserRegister(parent, args), UserUpdate: User.UserUpdate(parent, args), LandingCreate: Landing.LandingCreate(parent, args), LandingUpdate: Landing.LandingUpdate(parent, args), CategoryCreate: Category.CategoryCreate(parent, args), CategoryUpdate: Category.CategoryUpdate(parent, args), }, };
问题原因
你当前是直接调用了resolver函数,而非将函数本身作为resolver赋值给Query/Mutation字段。代码里User.UserDelete(parent, args)这类写法会在定义resolves对象时立即执行函数,此时parent和args变量根本未定义,因此抛出ReferenceError。
解决方法
方法1:直接传入函数引用(推荐)
Apollo Server会在执行查询/变更时自动向resolver函数传入parent、args、context、info四个参数,你只需把函数本身赋值给对应字段即可:
import { User, Landing, Category } from './resolvers'; export const resolves = { Query: { UserDelete: User.UserDelete, UserAuth: User.UserAuth, UserView: User.UserView, UserLandings: User.UserLandings, CategoriesView: Category.CategoriesView, CategoryView: Category.CategoryView, CategoryDelete: Category.CategoryDelete, LandingDelete: Landing.LandingDelete, LandingUp: Landing.LandingUp, LandingDown: Landing.LandingDown, LandingView: Landing.LandingView, LandingsView: Landing.LandingsView, }, Mutation: { UserRegister: User.UserRegister, UserUpdate: User.UserUpdate, LandingCreate: Landing.LandingCreate, LandingUpdate: Landing.LandingUpdate, CategoryCreate: Category.CategoryCreate, CategoryUpdate: Category.CategoryUpdate, }, };
方法2:箭头函数包裹(适用于需额外处理参数的场景)
如果需要在调用resolver前做参数预处理,可以用箭头函数接收Apollo传递的参数,再手动调用你的resolver:
// 单个字段示例写法 UserDelete: (parent, args, context, info) => { // 此处可添加自定义逻辑 return User.UserDelete(parent, args, context, info); }
这种写法仅在需要自定义参数时使用,无特殊需求优先用方法1。
内容的提问来源于stack exchange,提问作者nevoni3008
相关产品推荐
相关产品推荐

