Node.js中express-graphql结合mongoose定义Mutation嵌套字段失效问题
问题排查及修复方案
1. 核心问题梳理
- GraphQL中嵌套结构作为参数输入时,不能直接使用输出用的
GraphQLObjectType,也不能直接在args里嵌套字段定义,必须专门定义对应的GraphQLInputObjectType输入类型 - 类型定义文件中
UserType的嵌套字段写为大写开头的UserDetail,和Mongoose模型里小写开头的userDetail字段名不一致,会导致返回数据时该字段为空 - Mutation文件导入
UserDetailType时大小写不匹配,导致类型导入失败 - 原Mutation中
userDetail参数的字段定义方式不符合GraphQL规范
修正后的代码
类型定义文件
const { GraphQLObjectType, GraphQLString, GraphQLID, GraphQLInputObjectType // 新增输入类型导入 } = require("graphql"); // 输出用UserDetail类型保留 const UserDetailType = new GraphQLObjectType({ name: "UserDetail", description: "UserDetail 输出类型", fields: () => ({ userTitle: { type: GraphQLString }, userCity: { type: GraphQLString }, }), }); // 新增输入用UserDetail类型 const UserDetailInputType = new GraphQLInputObjectType({ name: "UserDetailInput", description: "UserDetail 输入类型", fields: () => ({ userTitle: { type: GraphQLString }, userCity: { type: GraphQLString }, }), }); const UserType = new GraphQLObjectType({ name: "User", description: "User 类型", fields: () => ({ id: { type: GraphQLID }, userName: { type: GraphQLString }, userLastname: { type: GraphQLString }, userEmail: { type: GraphQLString }, userPassword: { type: GraphQLString }, userFirebaseToken: { type: GraphQLString }, userActive: { type: GraphQLString }, userImage: { type: GraphQLString }, userDetail: { // 修正字段名为小写,和模型匹配 type: UserDetailType } }), }); // 导出新增的输入类型 module.exports = { UserType, UserDetailType, UserDetailInputType };
Mutation定义文件
const { GraphQLString } = require("graphql"); const { UserType, UserDetailInputType } = require("./types"); // 修正导入命名、新增输入类型导入 const { User } = require("../models"); const register = { type: UserType, args: { userName: { type: GraphQLString }, userLastname: { type: GraphQLString }, userEmail: { type: GraphQLString }, userPassword: { type: GraphQLString }, userFirebaseToken: { type: GraphQLString }, userActive: { type: GraphQLString }, userImage: { type: GraphQLString }, userDetail: { type: UserDetailInputType } // 替换为输入类型 }, async resolve(parent, args) { const user = new User(args); const result = await user.save(); return result; }, }; module.exports = { register };
调用示例
mutation { register( userName: "张三", userLastname: "张", userEmail: "zhangsan@example.com", userPassword: "123456", userDetail: { userTitle: "工程师", userCity: "北京" } ) { id userName userDetail { userTitle userCity } } }
内容的提问来源于stack exchange,提问作者krkmzugur
相关产品推荐
相关产品推荐

