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

Posted

技术标签:

【中文标题】Apollo Server, Graphql - 必须提供查询字符串【英文标题】:Apollo Server, Graphql - Must provide query string 【发布时间】:2019-06-02 11:02:52 【问题描述】:

我不确定我在这里做错了什么?在我的无服务器设置中让我的突变与我的 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

我不知道这里是否有人可以告诉我我做错了什么,我试图将其全部移至查询解析器,然后它可以将“突变”替换为“查询”,但使用“查询”在这里,我想稍后当我真正想使用 Mutation 来改变数据时,我仍然需要它来工作?

谁能告诉我这里哪里错了?

编辑

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

【问题讨论】:

【参考方案1】:

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


  "query": "<GraphQL Document>",
  "variables ,

无论操作本身是query 还是mutation,都是这种情况。

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

操作定义如下所示:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

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

mutation SomeMutation 
  signIn(username: "SomeUser", password: "SomePassword") 
    token
  

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

操作名称是可选的,但在后端包含它以用于调试目的是有帮助的。从技术上讲,操作类型也可以省略,在这种情况下,GraphQL 只是假设类型是查询。例如,这仍然是一个有效的文档:


  users 
    id
  

并且等价于

query SomeName 
  users 
    id
  

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


  "query": "mutation SomeName ($username: String!, $password: String!)  signIn(username: $username, password: $password)  token  ",
  "variables 
    "username": "SomeUser",
    "password": "SomePassword"
  ,

【讨论】:

你先生赢得了我今天的互联网奖!谢谢你把它剪成我能理解的东西! :)

以上是关于Apollo Server, Graphql - 必须提供查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

来自 GraphQL 网站的 Apollo-server 教程产生错误

如何从 Apollo Server 端点获得完整的 GraphQL 架构?

使用 Apollo Server 时如何生成 schema.graphql 文件?

Apollo-server-express 返回“无法获取 /”而不是 Graphql 操场

使用替代 GraphQL 客户端连接到 Apollo Server

使用 ApolloClient 和 Apollo-Server-Express 处理 GraphQL 错误