gpt4 book ai didi

graphql - 使用Apollo客户端发出弃用警告

转载 作者:行者123 更新时间:2023-12-03 17:20:22 29 4
gpt4 key购买 nike

背景

我们正在做一个相当大的Apollo项目。我们的api的简化版本如下所示:

type Operation {
foo: String
activity: Activity
}

type Activity {
bar: String
# Lots of fields here ...
}

我们已经意识到,将 OperationActivity拆分不会带来任何好处,并且会增加复杂性。我们想将它们合并。但是有很多查询都在代码库中采用了这种结构。为了使过渡逐步进行,我们添加了 @deprecated指令:

type Operation {
foo: String
bar: String
activity: Activity @deprecated
}

type Activity {
bar: String @deprecated(reason: "Use Operation.bar instead")
# Lots of fields here ...
}

实际问题

有什么方法可以突出显示将来的弃用情况吗?最好通过在(在测试环境中)运行使用已弃用字段的查询时在浏览器控制台中打印警告?

最佳答案

因此,两年后回到GraphQL,我才发现schema directives can be customized(如今是?)。所以这是一个解决方案:

import { SchemaDirectiveVisitor } from "graphql-tools"
import { defaultFieldResolver } from "graphql"
import { ApolloServer } from "apollo-server"


class DeprecatedDirective extends SchemaDirectiveVisitor {
public visitFieldDefinition(field ) {
field.isDeprecated = true
field.deprecationReason = this.args.reason

const { resolve = defaultFieldResolver, } = field
field.resolve = async function (...args) {
const [_,__,___,info,] = args
const { operation, } = info
const queryName = operation.name.value
// eslint-disable-next-line no-console
console.warn(
`Deprecation Warning:
Query [${queryName}] used field [${field.name}]
Deprecation reason: [${field.deprecationReason}]`)
return resolve.apply(this, args)
}
}

public visitEnumValue(value) {
value.isDeprecated = true
value.deprecationReason = this.args.reason
}
}

new ApolloServer({
typeDefs,
resolvers,
schemaDirectives: {
deprecated: DeprecatedDirective,
},
}).listen().then(({ url, }) => {
console.log(`🚀 Server ready at ${url}`)
})


这适用于服务器而不是客户端。但是,它应该打印出在客户端上跟踪错误查询所需的所有信息。从维护角度来看,将其存储在服务器日志中似乎是可取的。

关于graphql - 使用Apollo客户端发出弃用警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056844/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com