当前位置:  开发笔记 > 编程语言 > 正文

GraphQL - 如何使用不同的状态代码进行响应?

如何解决《GraphQL-如何使用不同的状态代码进行响应?》经验,为你挑选了2个好方法。

我在使用Graphql和Apollo Client时遇到了麻烦.

当我使用REST时,我总是创建不同的响应,如401代码,但在这里我不知道如何做类似的行为.

当我得到响应时,我希望它转到catch函数.我在前面有这个代码:

client.query({
  query: gql`
    query TodoApp {
      todos {
        id
        text
        completed
      }
    }
  `,
})
  .then(data => console.log(data))
  .catch(error => console.error(error));

有谁能够帮我?



1> helfer..:

在GraphQL中返回错误的方法(至少在graphql-js中)是在resolve函数中抛出错误.由于HTTP状态代码特定于HTTP传输,而GraphQL不关心传输,因此您无法在那里设置状态代码.你可以做的是在你的解析函数中抛出一个特定的错误:

age: (person, args) => {
  try {
    return fetchAge(person.id);
  } catch (e) {
    throw new Error("Could not connect to age service");
  }
}

GraphQL错误会在响应中发送到客户端,如下所示:

{
  "data": {
    "name": "John",
    "age": null
  },
  "errors": [
    { "message": "Could not connect to age service" }
  ]
}

如果消息不是足够的信息,您可以为GraphQL服务器创建一个包含状态代码的特殊错误类.要确保状态代码包含在您的响应中,您必须formatError在创建中间件时指定该功能:

app.use('/graphql', bodyParser.json(), graphqlExpress({ 
    schema: myGraphQLSchema,
    formatError: (err) => ({ message: err.message, status: err.status }),
}));



2> Glenn Sonna..:

规范中最近增加了有关错误输出的信息:

GraphQL服务可以通过键扩展为错误提供附加条目。如果设置了该条目,则其值必须具有一个映射。此项保留给实现者,以将其他信息添加到错误中,但是他们认为合适,并且对其内容没有任何其他限制。

现在,extensions您可以使用该字段将机器可读信息定制为您的errors 条目:

{
  "errors": [
    {
      "message": "Name for character with ID 1002 could not be fetched.",
      "locations": [ { "line": 6, "column": 7 } ],
      "path": [ "hero", "heroFriends", 1, "name" ],
      "extensions": {
        "code": "CAN_NOT_FETCH_BY_ID",
        "timestamp": "Fri Feb 9 14:33:09 UTC 2018"
      }
    }
  ]
}

最新版本的Apollo-Server符合此功能的规范,请在此处查看。

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有