【问题标题】:$lastName of type String used in position expecting type String$lastName 类型的 String 用于预期类型 String 的位置
【发布时间】:2020-03-14 03:44:54
【问题描述】:

这可能会编码

架构

import { gql } from 'apollo-server-express';

export default gql`
  extend type Mutation {
    signUp(
      lastName: String!
    ): String!
  }
`;

解析器

{
  Query: {},
  Mutation: {
    signUp: async (
      _,
      { lastName}
    ) => {
      try {
        console.log(lastName)
        return 'ok';    
      } catch (error) {
        return 'error';
      }
    },
  },
};

请求

mutation($lastName:String){
  signUp(lastName:$lastName)
}

查询验证

{"lastName":"Darjo" }

我看不懂,但我得到错误

“类型为 \"String\" 的变量 \"$lastName\" 用于预期类型 \"String!\".",

但是当我删除标志 ! lastName: String 一切正常。

我只是无法理解。是什么原因?。

【问题讨论】:

    标签: javascript node.js graphql apollo-server


    【解决方案1】:

    您已将lastName 参数的类型指定为String!! 表示类型是非空的——换句话说,参数是必需的,不能等于空。

    在您的查询中,您定义了一个变量 ($lastName) 并为其分配了一个类型。可以将参数传递给变量,但前提是它们的类型匹配。例如,如果参数采用Int,则不能将Boolean 类型的变量传递给它。同样,如果参数不为空,则不能将可空变量传递给它。这是因为可空变量可能为空,但这会违反参数的不可空性。

    请注意,相反的情况并非如此——可为空的参数可以接受非空变量。

    这是有效的:

    # String! argument and String! variable
    type Mutation {
      signUp(lastName: String!): String!
    }
    
    mutation($lastName:String!) {
      signUp(lastName:$lastName)
    }
    

    同样有效:

    # String argument and String! variable
    type Mutation {
      signUp(lastName: String): String!
    }
    
    mutation($lastName: String!) {
      signUp(lastName: $lastName)
    }
    

    原来是这样的:

    # String argument and String variable
    type Mutation {
      signUp(lastName: String): String!
    }
    
    mutation($lastName: String) {
      signUp(lastName: $lastName)
    }
    

    但这是无效

    # String! argument and String variable
    type Mutation {
      signUp(lastName: String!): String!
    }
    
    mutation($lastName: String) {
      signUp(lastName: $lastName)
    }
    

    唯一的例外是为变量提供默认值。所以这仍然有效:

    # String! argument and String variable
    type Mutation {
      signUp(lastName: String!): String!
    }
    
    mutation($lastName: String = "Some default value") {
      signUp(lastName: $lastName)
    }
    

    您可以在spec 中阅读有关变量验证的信息。

    【讨论】:

    • 谢谢。在我们的例子中,我知道所有消费者都在传递一个非空值,但我仍然无法重构我们的模式以使 String 变量成为必需。这似乎是一种耻辱。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多