如何在GraphQL嵌套查询的解析器函数中传递根参数?
解决Category2解析器无法获取Category1名称的问题
你的问题主要出在解析器参数名错误和数据字段映射不匹配这两个点上,下面一步步帮你修复:
1. 修正解析器的参数名错误
你的cat2Resolve里写了rootargs.name,但GraphQL解析器的父对象参数默认是root(或者用parent更直观),不是rootargs。直接修正参数名就能访问到父对象的属性:
// Category2解析器函数 const cat2Resolve = (parent, args) => { // parent就是当前关联的Category1对象,直接取它的name字段 return db.query('SELECT * from data WHERE category1_name = ? AND category2_name = ?', [parent.name, args.secondName]); };
2. 确保Category1解析器返回的对象包含正确的name字段
你的cat1resolve执行SQL后返回的数据库行里,字段是category1_name,但Category1Type定义的name字段默认会去读取root.name,这就会出现字段不匹配的问题。你可以用两种方式修复:
方式一:在SQL查询中重命名字段
直接在查询结果里把category1_name映射为name:
// Category1解析器函数 const cat1resolve = async (root, args) => { const results = await db.query('SELECT category1_name AS name FROM data WHERE category1_name = ?', [args.name]); return results; };
方式二:给Category1Type的name字段单独添加resolve函数
如果不想修改SQL,可以在字段定义里手动映射数据库字段:
const Category1Type = new GraphQLObjectType({ name: 'Category1', description: '<>', fields: () => ({ name: { type: GraphQLString, // 这里的root是数据库返回的原始行,读取对应的category1_name字段 resolve: (root) => root.category1_name }, category2: { type: new GraphQLList(Category2Type), args: { secondName: { type: GraphQLString } }, resolve: cat2Resolve } }) });
3. 修正查询语句的参数名匹配
注意你的查询语句里写的是category2(name: $name),但Category1Type里category2的参数定义是secondName,所以查询语句要对应修改:
Category1(name: $name){ name category2(secondName: $secondName){ name } }
做完以上调整后,cat2Resolve就能通过parent.name拿到当前Category1的名称,顺利完成联合过滤逻辑了。
内容的提问来源于stack exchange,提问作者CoderBC
相关产品推荐
相关产品推荐

