使用graphql和apollo抛出一个描述性错误

使用graphql和apollo抛出一个描述性错误,graphql,apollo,apollo-client,apollo-server,typegraphql,Graphql,Apollo,Apollo Client,Apollo Server,Typegraphql,考虑以下类别: //实体/Account.ts 从“typeorm”导入{Entity、PrimaryGeneratedColumn、Column、BaseEntity、Index、CreateDateColumn、UpdateDateColumn} 从'type graphql'导入{Field,Int,ObjectType} @ObjectType() @实体() 导出类帐户扩展BaseEntity{ @字段(()=>Int) @PrimaryGeneratedColumn() 身份证号码

考虑以下类别:

//实体/Account.ts
从“typeorm”导入{Entity、PrimaryGeneratedColumn、Column、BaseEntity、Index、CreateDateColumn、UpdateDateColumn}
从'type graphql'导入{Field,Int,ObjectType}
@ObjectType()
@实体()
导出类帐户扩展BaseEntity{
@字段(()=>Int)
@PrimaryGeneratedColumn()
身份证号码
@字段()
@列({length:50,unique:true})
@索引({unique:true})
accountIdentifier:字符串
@字段({nullable:true})
@列({length:100})
名称?:字符串
}
使用相应的解析器:

//AccountResolver.ts
@分解器()
导出类AccountResolver{
@突变(()=>账户)
异步addAccount(@Arg('options',()=>AccountInput)选项:AccountInput){
试一试{
//如果(!options.accountIdentifier){
//抛出新错误(`添加帐户失败:缺少accountIdentifier`)
// }
返回等待帐户。创建(选项)。保存()
}捕获(错误){
if(error.message.includes('cannotinsert replicate key')){
抛出新错误(
`添加帐户失败:该帐户已存在。${error}`
)
}否则{
抛出新错误(`添加帐户失败:${Error}`)
}
}
}
}
Jest测试文件

//AccountResolver.test.ts
描述('addAccount突变',()=>{
它('缺少accountIdentifier时应引发错误',async()=>{
期待(
变异({
突变:gql`
突变{
帐户(
选项:{
姓名:“詹姆斯·邦德”
用户名:“詹姆斯。Bond@contoso.com"
}
) {
帐户标识符
}
}
`,
})
).rejects.TothRowerr('缺少帐户标识符')
})
字段
accountIdentifier
是必需的,当请求中缺少该字段时,该字段应引发描述性错误消息。但是,引发的错误是:

“网络错误:响应不成功:收到状态代码400”

修改错误消息的正确方法是什么?我使用查看了
类型图ql
,并确保设置了
验证:true
,但它不会给出描述性错误

编辑 在检查graphql后,默认情况下它确实显示了正确的错误消息。剩下的唯一问题是如何编写jest测试,以便它可以读取此消息:

{
  "error": {
    "errors": [
      {
        "message": "Field AccountInput.accountIdentifier of required type String! was not provided.",

感谢您提供的任何帮助。

您的客户端返回的
ApolloError
包含响应中返回的
错误和执行请求时遇到的任何网络错误。前者可在
graphQLErrors
属性下访问,后者可在
networkError
属性下访问属性。除了使用
到下面的错误
,您应该使用
到对象

const expectedError = {
  graphQLErrors: [{ message: 'the accountIdentifier is missing' }]
}
await expect(client.mutate(...)).rejects.toMatchObject(expectedError)
然而,我建议避免使用Apollo客户端进行测试,相反,您可以直接对您的模式执行操作

import { buildSchema } from 'type-graphql'
import { graphql } from 'graphql'

const schema = await buildSchema({
  resolvers: [...],
})
const query = '{ someField }'
const context = {}
const variables = {}
const { data, errors } = await graphql(schema, query, {}, context, variables)

客户端返回的
ApolloError
包含响应中返回的
错误和执行请求时遇到的任何网络错误。前者可在
graphQLErrors
属性下访问,后者可在
networkError
属性下访问。禁止使用
TothRower
,您应该改为使用
toMatchObject

const expectedError = {
  graphQLErrors: [{ message: 'the accountIdentifier is missing' }]
}
await expect(client.mutate(...)).rejects.toMatchObject(expectedError)
然而,我建议避免使用Apollo客户端进行测试,相反,您可以直接对您的模式执行操作

import { buildSchema } from 'type-graphql'
import { graphql } from 'graphql'

const schema = await buildSchema({
  resolvers: [...],
})
const query = '{ someField }'
const context = {}
const variables = {}
const { data, errors } = await graphql(schema, query, {}, context, variables)

感谢您的回答,但根据您的建议,jest收到的是“graphQLErrors”:Array[],`而不是graphql Played中可见的错误消息。使用正确的错误消息对象更新了OP。我将根据您的建议尝试将我的代码转换为不使用
apollo client
。@DarkLite1抱歉,我忘了提到这里的另一个问题是您发送的查询实际上无效(这是400状态指示的)。您可以检查错误对象上的
networkError
属性的值以确定原因。最后一个问题:不使用
apollo client
是否有好处?您为什么建议这样做?如果您有GraphQL API,您要测试的是该API的响应,而不一定是任何客户端如何使用该响应onse.True!并且直接使用
graphql
也更简洁。只剩下一个问题,与我的jest预期匹配到此错误对象“[GraphQLError:Field AccountInput.accountIdentifier of required type String!”未提供。],`。语法似乎不正确。感谢您的回答,但根据您的建议,我们收到的jest是`“graphQLErrors”:Array[],`而不是graphql Played中可见的错误消息。使用正确的错误消息对象更新了OP。我将根据您的建议尝试将我的代码转换为不使用
apollo client
。@DarkLite1抱歉,我忘了提到这里的另一个问题是您发送的查询实际上无效(这是400状态指示的)。您可以检查错误对象上的
networkError
属性的值以确定原因。最后一个问题:不使用
apollo client
是否有好处?您为什么建议这样做?如果您有GraphQL API,您要测试的是该API的响应,而不一定是任何客户端如何使用该响应onse.True!直接使用
graphql
也更简洁。只剩下一个问题,将我的jest预期与此错误对象匹配,“[graphqleror:Field AccountInput.accountIdentifier of required type String!”未提供。],`。语法似乎不正确。