Apollo Server,Graphql - 必须提供查询字符串

Nop*_*zen 3 javascript apollo graphql serverless

我不确定我在这里做错了什么?我现在在无服务器设置中让我的突变与我的 apollo-server-lambda 一起运行已经有一段时间了,当我尝试运行这样的查询时,我的查询工作正常:

{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }
Run Code Online (Sandbox Code Playgroud)

我刚收到消息:“必须提供查询字符串。” 状态 400。

我已经像这样设置了我的解析器:

const resolvers = {
  Query: {
    users: async (_, args, ctx) => User.load(args, ctx)
  },

  Mutation: {
    signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
  }
};
Run Code Online (Sandbox Code Playgroud)

对于额外的信息,这里是我的 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!
  }
`;
Run Code Online (Sandbox Code Playgroud)

我正在使用邮递员来测试我的 graphql 端点,我的内容类型是 application/json

我不知道这里是否有人能告诉我我做错了什么,我尝试将其全部移至查询解析器,然后它可以将“变异”替换为“查询”,但是使用此处的“查询”对我来说没有意义我想稍后当我真的想使用 Mutation 来改变数据时,我无论如何都需要它来工作?

谁能告诉我我错在哪里?

编辑

我安装了:graphql-playground-middleware-lambda并使用以下方法设置了无服务器设置:https : //github.com/prisma/graphql-playground#as-serverless-handler,如果我使用 Graphiql,它会按预期工作,但如果有人知道出了什么问题,我仍然感兴趣用我通过邮递员发送的json?

Dan*_*den 6

发送请求时,您的请求正文应该是格式正确的 JSON 对象,带有一个query属性(variables如果包含变量,还可以选择一个属性):

{
  "query": "<GraphQL Document>",
  "variables {},
}
Run Code Online (Sandbox Code Playgroud)

无论操作本身是 aquery还是 a ,情况都是如此mutation

上述query属性的实际值必须是语法正确的文档,如 GraphQL规范中所述。文档通常由单个操作定义( aquery或 a mutation)组成,其中包括该操作的所有请求字段。该文档还将包括片段(如果使用)。

操作定义如下所示:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet
Run Code Online (Sandbox Code Playgroud)

所以你可以有一个这样的文件:

mutation SomeMutation {
  signIn(username: "SomeUser", password: "SomePassword") {
    token
  }
}
Run Code Online (Sandbox Code Playgroud)

这里,操作的类型mutation名称SomeMutation,最外面的一组大括号之间的所有内容都是选择集。如果您有任何变量,它们的类型将在选择集之前的括号中声明。

操作名称是可选的,但为了在后端进行调试而包含它会很有帮助。从技术上讲,操作类型也可以省略,在这种情况下,GraphQL 简单地假设类型是查询。例如,这仍然是一个有效的文档:

{
  users {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

并且等价于

query SomeName {
  users {
    id
  }
}
Run Code Online (Sandbox Code Playgroud)

前者称为查询速记。显然,这不能用于突变,因此突变必须始终明确说明其操作类型。一个完整的例子:

{
  "query": "mutation SomeName ($username: String!, $password: String!) { signIn(username: $username, password: $password) { token } }",
  "variables {
    "username": "SomeUser",
    "password": "SomePassword"
  },
}
Run Code Online (Sandbox Code Playgroud)