这可能会编码
架构
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)
}
查询Veriables
{"lastName":"Darjo" }
我听不懂,但出现错误
类型“ \ String \”的“变量\” $ lastName \”用于期望类型为“ String!\”的位置。”,
但是当我删除标志! lastName: String
时,一切正常。
我只是听不懂。是什么原因?。
答案 0 :(得分:1)
您已将lastName
参数的类型指定为String!
。 !
表示类型为非null-换句话说,该参数是必需的,不能等于null。
在查询中,您正在定义变量($lastName
)并为其分配类型。可以将参数传递给变量,但前提是它们的类型匹配。例如,如果参数采用Int
,则不能将其传递给Boolean
类型的变量。同样,如果参数为非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)
}
唯一的例外是您提供变量的默认值。因此,这仍然有效:
# String! argument and String variable
type Mutation {
signUp(lastName: String!): String!
}
mutation($lastName: String = "Some default value") {
signUp(lastName: $lastName)
}
您可以在spec中阅读有关变量验证的信息。