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

slo*_*nzo 11 javascript apollo graphql react-apollo

我在使用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));
Run Code Online (Sandbox Code Playgroud)

有谁能够帮我?

hel*_*fer 23

在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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "data": {
    "name": "John",
    "age": null
  },
  "errors": [
    { "message": "Could not connect to age service" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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


Gle*_*nna 7

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

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"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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