2017-10-17 13 views
1

私は、大変な作業をして突然変異を起こそうとしています。 このGraphQLスキーマが与えられた場合、誰でも私は単純な作成ユーザーの変異を作成するのを助けてください?私は何が欠けているのか分かりません。私はGraphQLサーバーから400のエラーをスローするポイントに達し、解決機能は起動しません。Reactネイティブの400の悪い要求を返すためのリレー変異?

var userType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'User creator', 
    fields:() => ({ 
    id: { 
     type: new GraphQLNonNull(GraphQLString), 
     description: 'The id of the user.' 
    }, 
    email: { 
     type: GraphQLString, 
     description: 'The email of the user.' 
    }, 
    business: { 
     type: GraphQLString, 
     description: 
     'The name of the business of the user as the app refers to it.' 
    }, 
    businessDisplayName: { 
     type: GraphQLString, 
     description: 'The name of the business of the user as they typed it in.' 
    }, 
    trips: { 
     type: new GraphQLList(tripType), 
     description: 'The trips of the user, or an empty list if they have none.', 
     resolve: (user, params, source, fieldASTs) => { 
     var projections = infoToProjection(fieldASTs) 
     return Trip.find(
      { 
      _id: { 
       // to make it easily testable 
       $in: user.trips.map(id => id.toString()) 
      } 
      }, 
      projections, 
      function(err, docs) { 
      return docs 
      } 
     ) 
     } 
    } 
    }) 
}) 


var schema = new GraphQLSchema({ 
    query: new GraphQLObjectType({ 
    name: 'root', 
    fields: { 
     trips: { 
     type: new GraphQLList(tripType), 
     resolve: function() { 
      return Trip.find({}) 
     } 
     }, 
     users: { 
     type: new GraphQLList(userType), 
     resolve: function() { 
      return User.find({}) 
     } 
     }, 
     user: { 
     type: userType, 
     args: { 
      id: { 
      name: 'id', 
      type: new GraphQLNonNull(GraphQLString) 
      } 
     }, 
     resolve: (root, { id }, source, fieldASTs) => { 
      return User.findOne(
      { _id: id }, 
      infoToProjection(fieldASTs), 
      function(err, doc) { 
       return doc 
      } 
     ) 
     } 
     }, 
     trip: { 
     type: tripType, 
     args: { 
      id: { 
      name: 'id', 
      type: new GraphQLNonNull(GraphQLString) 
      } 
     }, 
     resolve: (root, { id }, source, fieldASTs) => { 
      var projections = infoToProjection(fieldASTs) 
      return Trip.findOne({ _id: id }, projections, function(err, doc) { 
      return doc 
      }) 
     } 
     } 
    } 
    }), 

    // mutation 
    mutation: new GraphQLObjectType({ 
    name: 'Mutation', 
    fields: { 
     createUser: { 
     name: 'createUser', 
     type: userType, 
     args: { 
      input: { type: new GraphQLInputObjectType({ 
      name: 'user', 
      fields: { 
       business: { type: GraphQLString }, 
       email: { type: GraphQLString }, 
       businessDisplayName: { type: GraphQLString } 
      } 
      }) 
     }}, 
     resolve: (parentValue, args) => { 
      let user = new User({ ...args.input }) 
      user.save() 
      return user 
     } 
     } 
    }) 
}) 

export var getProjections = infoToProjection 
export default schema 

これは、次のクエリや変異を使用してGraphiQLで動作します:

mutation { 
    createUser(input:{business:"business", email: "[email protected]", businessDisplayName: "businessDN"}) { 
    id 
    email 
    business 
    businessDisplayName 
    } 
} 

fragment UserFragment on User { 
    id 
    business 
    businessDisplayName 
    trips{ 
     title 
    } 
} 

{ 
    hideya: user(id: "someid") { 
    ...UserFragment 
    } 
} 

答えて

0

私は最終的に問題を修正しました。問題の原因を理解しようとしたので、適切なロギングと意味のあるエラーメッセージを有効にするために新しいNetworkLayerを使用しました。私の突然変異が失敗したときに、その後、エラーを投げた。エラーメッセージは「フィールドclientMutationIdを照会できません」です。それを見て、オブジェクトを変異させるためには、そのフィールドをGraphQL型に持つ必要があることを発見しました。だから私はそれを追加しました。

教訓react-relay-network-layerを使用することを強くお勧めします。


詳細:ここ

はそれのために私のコードです:

import { 
    RelayNetworkLayer, 
    urlMiddleware, 
    batchMiddleware, 
} from 'react-relay-network-layer'; 

Relay.injectNetworkLayer(new RelayNetworkLayer([ 
    batchMiddleware({ 
    batchUrl: 'http://localhost:3000/graphql', 
    }), 
    urlMiddleware({ 
    url: 'http://localhost:3000/graphql', 
    }), 
])); 

注:これは、ログを有効にし、デフォルトではそれはシンプルにconsole.logです。

const params = { 
     email: email.toLowerCase(), 
     businessDisplayName: business, 
     business: business.toLowerCase() 
     } 
     var onSuccess =() => { 
     console.log('Mutation successful!') 
     } 
     var onFailure = transaction => { 
     var error = transaction.getError() || new Error('Mutation failed.') 
     console.error(error) 
     } 

     Relay.Store.commitUpdate(new FindOrCreateUser({ user: { ...params } }), { onFailure, onSuccess }) 

そしてもちろん、あなたは常にあなたのキャッシュをきれいにし、あなたのパッケージャを再起動する必要があります。ここでは

は、私はエラーを投げた方法です。

関連する問題