使用express-graphql&处理错误反应-阿波罗

时间:2018-02-21 19:38:42

标签: reactjs graphql graphql-js react-apollo express-graphql

我正在尝试在登录表单上显示一个简单的“电子邮件和密码不匹配”错误,但我遇到了麻烦,并且不确定我出错的地方是在服务器上还是在我的React应用程序中。我以为我会在这里发帖,因为我不确定哪个github回购是合适的。 这是服务器上的解析器:

// Schema definition:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload!
}

type SignInPayload {
   token: String
   expires: Int
   requiresReset: Boolean
}

// Mapping the mutation to the resolver:

Mutation: {
   loginViewer: loginViewerMutation,
},


// Resolver:

const loginViewerMutation = async (obj, args) => {
   const { credentials } = args
   const user = await User.findOne({ email })
   if (!user) throw new GraphQLError('Email and password do not match')
   const matches = await user.comparePassword(password)
   if (!matches) throw new GraphQLError('Email and password do not match')
   return createJWT(user)
}

然后,在我的Login组件中调用的变异:

const mutation = gql`
   mutation LoginViewer($password: String!, $email: String!) {
      loginViewer(credentials: { email: $email, password: $password }) {
         token
         expires
         requiresReset
      }
   }
`

export class Login extends React.Component {
   handleLogin = (credentials) => {
      this.props
         .mutate({ variables: { ...credentials } })
         .then(() => {
            // ...
         })
         .catch((error) => {
            console.log(error.message)
            console.log(error.graphQLErrors)
            // ...
         })
   }

   render() {
      // ...
   }
}

export default graqphql(mutation)(Login)

当我提供正确的信息时,一切都按预期工作。如果不这样做,捕获的错误不包含GraphQLErrors。

我正在使用apollo-link-error中间件和默认设置:https://www.apollographql.com/docs/link/links/error.html

我的控制台看起来像这样:

enter image description here

正在返回预期的身份验证错误,并从中间件记录。但是,在我的Login组件中,error.graphQLErrors数组为空。

我在哪里可能会出错?

  • 返回500内部服务器错误似乎不正确---它的行为完全符合我的要求。我是否在服务器上错误地实现了这一点?

  • 如何在记录中间件和.catch(错误)之间“丢失”graphQLErrors?

1 个答案:

答案 0 :(得分:1)

我在express-graphql github repo上问了这个问题,他们很快指出解决方案是删除我!突变上的loginViewer

// Schema definition:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload!
}

// Should be:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload
}
  

自您的顶级字段(loginViewer)以来的预期行为   定义为非null。这意味着当错误冒出它的GraphQL引擎时   没有选项,除了使数据字段等于null:

     

由于Non-Null类型字段不能为null,因此会传播字段错误   由父字段处理。如果父字段可能为null   然后它解析为null,否则如果它是非Null类型,则   字段错误进一步传播到它的父字段。

     

如果从请求的根目录到错误源的所有字段   返回非空类型,然后是"数据"响应中的条目应该是   空。

     

http://facebook.github.io/graphql/draft/#sec-Errors-and-Non-Nullability

     

如果数据为空,则表示整个请求失败   用500表示express-graphql响应。