从 ApolloServer GraphQL 向前端发送错误状态代码

发布于 2025-01-10 20:06:55 字数 482 浏览 0 评论 0原文

我在 Node 上运行这个简单的 Apollo Server GraphQL,我希望每次收到 401 之类的错误或 GQL 从 formatError 获得的任何其他错误时,将该错误状态发送到前端,因为现在 FE 总是即使有错误,

const gateway = new ApolloGateway({
  serviceList,
})

const server = new ApolloServer({
  gateway,
  formatError: (err: GraphQLError) => {
    return new ApolloError(err.message, err.extensions.code, err.extensions)
  },
})

我现在也会收到 200,每次抛出错误时 formatError 都会将该错误对象返回给 FE,但我还需要更改响应状态代码,而不是一直是 200。

I have this simple Apollo Server GraphQL running on Node, i want that every time i get something like 401 or any other error that GQL gets from formatError, send that error status to Front End, because now FE always receives 200 even if there is an error

const gateway = new ApolloGateway({
  serviceList,
})

const server = new ApolloServer({
  gateway,
  formatError: (err: GraphQLError) => {
    return new ApolloError(err.message, err.extensions.code, err.extensions)
  },
})

I have now that every time error is thrown formatError will return that error object to FE but i need to change response status code also instead of that being 200 all the time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

单挑你×的.吻 2025-01-17 20:06:55

在 GraphQL 文档中:

根据设计,GraphQL 不使用与 REST 相同的约定来通过 HTTP 动词和状态代码进行通信。

说了这么多,你可以按照既定的流程创建一个插件 链接

import { GraphQLRequestContext } from 'apollo-server-types'

export default async function({ response, errors }: GraphQLRequestContext) {
    if (errors?.length) {
        // @ts-ignore
        response.http.status = errors[0].extensions.code
    }
}

从上面来看,添加 @ts-ignore 语句很重要,因为它是GraphQLRequestContext 接口。

In GraphQL documentation:

GraphQL, by design, does not use the same conventions from REST to communicate via HTTP verbs and status codes.

Said that then, You can create a plugin according to the established flow Link:

import { GraphQLRequestContext } from 'apollo-server-types'

export default async function({ response, errors }: GraphQLRequestContext) {
    if (errors?.length) {
        // @ts-ignore
        response.http.status = errors[0].extensions.code
    }
}

From the above, it's important to add the @ts-ignore statement because it's an optional response statement in the GraphQLRequestContext interface.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文