Apollo Server、Graphql - 必须提供查询字符串
Apollo Server, Graphql - Must provide query string
我不确定我做错了什么?在我的无服务器设置中使用我的 apollo-server-lambda 将我的突变设置为 运行 已经有很长一段时间了,当我尝试 运行 这样的查询时,我的查询工作正常:
{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }
我刚收到消息:“必须提供查询字符串。”状态 400.
我已经像这样设置了我的解析器:
const resolvers = {
Query: {
users: async (_, args, ctx) => User.load(args, ctx)
},
Mutation: {
signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
}
};
有关更多信息,这是我的 typeDefs:
const typeDefs = gql`
type User {
id: ID!,
firstname: String,
lastname: String,
username: String,
createdAt: String,
role: String
}
type AuthToken {
token: String
}
type Query {
hello: String,
users(id: Int): [User]
}
type Mutation {
signIn(username: String!, password: String!): AuthToken!
}
`;
我正在使用 postman 测试我的 graphql 端点,我的内容类型是 application/json
我不知道这里是否有人可以告诉我我做错了什么,我试图将它全部移动到查询解析器,然后它可以用 "query" 替换 "mutation" 但它确实使在这里使用 "query" 对我来说很有意义,我想稍后当我真正想使用 Mutation 来改变数据时,我仍然需要它来工作吗?
谁能告诉我我哪里错了?
编辑
我安装了:graphql-playground-middleware-lambda
并设置了无服务器设置:https://github.com/prisma/graphql-playground#as-serverless-handler 如果我使用 Graphiql,它会按预期工作,但如果有人知道 json 我通过邮递员发送?
发送请求时,您的请求正文应该是格式正确的 JSON 对象,带有 query
属性(以及可选的 variables
属性 如果包括变量):
{
"query": "<GraphQL Document>",
"variables {},
}
无论操作本身是query
还是mutation
都是如此。
上面 query
属性 的实际值必须是句法正确的 文档 ,如 GraphQL specification 中所述。文档通常由单个操作定义(query
或 mutation
)组成,其中包括该操作的所有请求字段。如果使用任何片段,该文档还将包含片段。
操作定义如下所示:
OperationType [Name] [VariableDefinitions] [Directives] SelectionSet
因此您可以拥有这样的文档:
mutation SomeMutation {
signIn(username: "SomeUser", password: "SomePassword") {
token
}
}
这里,操作的type是mutation
,name是SomeMutation
,所有东西在最外面的一组大括号是 选择集 。如果您有任何变量,它们的类型将在选择集之前的括号中声明。
操作名称是可选的,但为了在后端进行调试,将其包含在内会很有帮助。从技术上讲,操作类型也可以省略,在这种情况下,GraphQL 简单地假定该类型是一个查询。例如,这仍然是一个有效的文档:
{
users {
id
}
}
等同于
query SomeName {
users {
id
}
}
前者简称为查询shorthand。显然,这不能用于突变,因此突变必须始终明确说明它们的操作类型。一个完整的例子:
{
"query": "mutation SomeName ($username: String!, $password: String!) { signIn(username: $username, password: $password) { token } }",
"variables {
"username": "SomeUser",
"password": "SomePassword"
},
}
我不确定我做错了什么?在我的无服务器设置中使用我的 apollo-server-lambda 将我的突变设置为 运行 已经有很长一段时间了,当我尝试 运行 这样的查询时,我的查询工作正常:
{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }
我刚收到消息:“必须提供查询字符串。”状态 400.
我已经像这样设置了我的解析器:
const resolvers = {
Query: {
users: async (_, args, ctx) => User.load(args, ctx)
},
Mutation: {
signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
}
};
有关更多信息,这是我的 typeDefs:
const typeDefs = gql`
type User {
id: ID!,
firstname: String,
lastname: String,
username: String,
createdAt: String,
role: String
}
type AuthToken {
token: String
}
type Query {
hello: String,
users(id: Int): [User]
}
type Mutation {
signIn(username: String!, password: String!): AuthToken!
}
`;
我正在使用 postman 测试我的 graphql 端点,我的内容类型是 application/json
我不知道这里是否有人可以告诉我我做错了什么,我试图将它全部移动到查询解析器,然后它可以用 "query" 替换 "mutation" 但它确实使在这里使用 "query" 对我来说很有意义,我想稍后当我真正想使用 Mutation 来改变数据时,我仍然需要它来工作吗?
谁能告诉我我哪里错了?
编辑
我安装了:graphql-playground-middleware-lambda
并设置了无服务器设置:https://github.com/prisma/graphql-playground#as-serverless-handler 如果我使用 Graphiql,它会按预期工作,但如果有人知道 json 我通过邮递员发送?
发送请求时,您的请求正文应该是格式正确的 JSON 对象,带有 query
属性(以及可选的 variables
属性 如果包括变量):
{
"query": "<GraphQL Document>",
"variables {},
}
无论操作本身是query
还是mutation
都是如此。
上面 query
属性 的实际值必须是句法正确的 文档 ,如 GraphQL specification 中所述。文档通常由单个操作定义(query
或 mutation
)组成,其中包括该操作的所有请求字段。如果使用任何片段,该文档还将包含片段。
操作定义如下所示:
OperationType [Name] [VariableDefinitions] [Directives] SelectionSet
因此您可以拥有这样的文档:
mutation SomeMutation {
signIn(username: "SomeUser", password: "SomePassword") {
token
}
}
这里,操作的type是mutation
,name是SomeMutation
,所有东西在最外面的一组大括号是 选择集 。如果您有任何变量,它们的类型将在选择集之前的括号中声明。
操作名称是可选的,但为了在后端进行调试,将其包含在内会很有帮助。从技术上讲,操作类型也可以省略,在这种情况下,GraphQL 简单地假定该类型是一个查询。例如,这仍然是一个有效的文档:
{
users {
id
}
}
等同于
query SomeName {
users {
id
}
}
前者简称为查询shorthand。显然,这不能用于突变,因此突变必须始终明确说明它们的操作类型。一个完整的例子:
{
"query": "mutation SomeName ($username: String!, $password: String!) { signIn(username: $username, password: $password) { token } }",
"variables {
"username": "SomeUser",
"password": "SomePassword"
},
}