字符串类型的 $lastName 用于期望字符串类型的位置

Jes*_*sus 2 javascript node.js graphql apollo-server

这可能编码

架构

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

export default gql`
  extend type Mutation {
    signUp(
      lastName: String!
    ): String!
  }
`;
Run Code Online (Sandbox Code Playgroud)

解析器

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

要求

mutation($lastName:String){
  signUp(lastName:$lastName)
}
Run Code Online (Sandbox Code Playgroud)

查询验证

{"lastName":"Darjo" }
Run Code Online (Sandbox Code Playgroud)

我无法理解,但我收到错误

"类型为 \"String\" 的变量 \"$lastName\" 用于期望类型为 \"String!\" 的位置。",

但是当我移除标志时 lastName: String一切正常。

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

Dan*_*den 7

您已将参数的类型指定lastNameString!. 的!表示该类型为非空-换句话说,参数是必需的,可以不等于空值。

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

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

这是有效的:

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

mutation($lastName:String!) {
  signUp(lastName:$lastName)
}
Run Code Online (Sandbox Code Playgroud)

同样有效:

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

mutation($lastName: String!) {
  signUp(lastName: $lastName)
}
Run Code Online (Sandbox Code Playgroud)

就像这样:

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

mutation($lastName: String) {
  signUp(lastName: $lastName)
}
Run Code Online (Sandbox Code Playgroud)

但是,这是不是有效的:

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

mutation($lastName: String) {
  signUp(lastName: $lastName)
}
Run Code Online (Sandbox Code Playgroud)

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

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

mutation($lastName: String = "Some default value") {
  signUp(lastName: $lastName)
}
Run Code Online (Sandbox Code Playgroud)

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