GraphQL错误:必须提供名称

时间:2018-08-04 06:20:59

标签: node.js mongodb graphql express-graphql

我正在编写用于在NodeJS中登录用户的变体。

出现错误“必须提供名称”。

这是浏览器GraphQL查询:

mutation{
  login(username:"dfgdfg",password:"test1234") {
    _id,
    name{
      fname,
      lname,
      mname
    }
  }
}

这是我的代码

    const login = {
    type: UserType,
    args: {
        input:{
            name:'Input',
            type: new GraphQLNonNull(new GraphQLObjectType(
                {
                    username:{
                    name:'Username',
                    type: new GraphQLNonNull(GraphQLString)
                    },
                    password:{
                    name:'Password',
                    type: new GraphQLNonNull(GraphQLString)
                    }
                }
            ))

        }
    },
    resolve: async (_, input, context) => {
        let errors = [];
        return UserModel.findById("5b5c34a52092182f26e92a0b").exec();

    }
  }

module.exports = login;

任何人都可以帮助我,为什么它会出错?

谢谢。

1 个答案:

答案 0 :(得分:1)

描述错误发生的位置 也是非常有帮助的。我假设它是在启动节点服务器时抛出的。

抛出此特定错误,因为您缺少对象配置的第8行中的name属性。同样,该类型必须为GraphQLInputObjectType而非GraphQLObjectType

args: {
    input: {
        type: new GraphQLNonNull(new GraphQLInputObjectType({
            name: 'LoginInput',
            fields: {
                username:{
                    name:'Username',
                    type: new GraphQLNonNull(GraphQLString)
                },
                password:{
                    name:'Password',
                    type: new GraphQLNonNull(GraphQLString)
                }
            }
        }))
    }
},

您的代码中还有很多其他问题:

您的代码中并未使用所有name属性(您可能是为了解决错误而添加了它们)。

您的查询与架构定义不匹配,要么直接在字段上使用两个参数usernamepassword,而不必使用额外的输入类型:

args: {
    username:{
        name:'Username',
        type: new GraphQLNonNull(GraphQLString)
    },
    password:{
        name:'Password',
        type: new GraphQLNonNull(GraphQLString)
    }
},

或者采用Anthony所述的查询方式:

mutation{
  login(input: { username: "dfgdfg",password: "test1234" }) {
    _id,
    name{
      fname,
      lname,
      mname
    }
  }
}