javascript - String 类型的 $lastName 用于需要 String 类型的位置

标签 javascript node.js graphql apollo-server

这可能是代码

架构

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" }

我无法理解,但我得到了错误

"Variable \"$lastName\" of type \"String\" used in position expecting type \"String!\".",

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

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

最佳答案

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

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

请注意,反之则不然——可为 null 的参数可以接受非 null 变量。

这是有效的:

# 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)
}

唯一的异常(exception)是您为变量提供默认值。所以这仍然有效:

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

mutation($lastName: String = "Some default value") {
  signUp(lastName: $lastName)
}

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

关于javascript - String 类型的 $lastName 用于需要 String 类型的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920213/

相关文章:

node.js - 如何创建实时音频流队列?

reactjs - 如何将 GraphQL 订阅与 React-relay 结合使用?

graphql - 突变的 Apollo react 未定义

javascript - Polymer:我究竟应该把我的 Javascript 放在哪里?

javascript - 循环 CSS 打字机效果并更改文本

javascript - 使用 react-window 滚动时出现故障的问题是什么?

javascript - 使用 jQuery 获取元素属性

node.js - 使用 Express 将额外数据包含到 Passport 中间件中

javascript - Node.js 全局 eval,抛出 ReferenceError

node.js - MongoDB、Mongoose 和 Apollo GraphQL 在文档中定义 _id 类型