2017-02-21 1 views
1

J'essaie de supprimer un magasin d'une connexion de magasins. Je continue d'obtenir l'erreur:Erreur lors de la tentative d'utilisation de NODE_DELETE pour mettre à jour Relay Store. Erreur non capturée: RelayMutationQuery: Champ attendu `stores` sur` viewer` pour être une connexion

Erreur non interceptée: RelayMutationQuery: champ attendu stores sur viewer pour être une connexion.

Mon objet spectateur est quelque chose comme ceci:

{ 
    "__dataID__":"VXNlcjp2aWV3ZXJfZml4ZWQ=", 
    "id":"VXNlcjp2aWV3ZXJfZml4ZWQ=", 
    "stores":{ 
    "__dataID__":"client:-1121235371", 
    "edges":[ 
     { 
     "__dataID__":"client:-1121235372", 
     "node":{ 
      "__dataID__":"U3RvcmU6NTg0MmIwODE1ZDY0NTY1NWU4NTVhOTc1", 
      "id":"U3RvcmU6NTg0MmIwODE1ZDY0NTY1NWU4NTVhOTc1", 
      "_id":"5842b0815d645655e855a976", 
      "address":null, 
      "closingHours":null, 
      "contactNumber":null, 
      "name":"s5", 
      "openingHours":null, 
      "isActive":true 
     } 
    }, 
    { 
     "__dataID__":"client:-1121235373", 
     "node":{ 
      "__dataID__":"U3RvcmU6NThhYmM2ZjcyNTgyNjI5NDVhYzZkMGEx", 
      "id":"U3RvcmU6NThhYmM2ZjcyNTgyNjI5NDVhYzZkMGEx", 
      "_id":"58abc6f7258262945ac6d0a2", 
      "address":null, 
      "closingHours":null, 
      "contactNumber":null, 
      "name":"Dete", 
      "openingHours":null, 
      "isActive":true 
     } 
    } 
    ] 
    } 
} 

Et mon dossier de mutation est:

import Relay from 'react-relay'; 

export default class DeleteStoreMutation extends Relay.Mutation { 
    getMutation() { 
    return Relay.QL`mutation{ DeleteStoreMutation }`; 
    } 

    getFatQuery() { 
    return Relay.QL` 
     fragment on DeleteStoreMutationPayload { 
     viewer 
     deletedId 
     } 
    `; 
    } 

    getConfigs() { 
    console.log(this.props.viewer); 
    return [{ 
     type: 'NODE_DELETE', 
     parentName: 'viewer', 
     parentID: this.props.viewer.id, 
     connectionName: 'stores', 
     deletedIDFieldName: 'deletedId' 
    }]; 
    } 

    getVariables() { 
    return { 
     _id: this.props.storeId, 
    }; 
    } 
} 

GraphQL Schéma de

import { UserType } from './types' 
import { GraphQLObjectType, GraphQLSchema } from 'graphql' 
import { nodeField, nodeInterface } from './node' 
import modules from './modules' 
import { AuthService } from '../services' 

let RootQuery = new GraphQLObjectType({ 
    name: 'RootQuery', 
    fields: { 
    viewer: { 
     type: UserType, 
     resolve: async ({ viewerId }) => AuthService.getViewer(viewerId) 
    }, 
    node: nodeField 
    } 
}); 


let RootMutation = new GraphQLObjectType({ 
    name: "RootMutation", 
    fields:() => ({ ...modules.mutations }) 
}); 

let schema = new GraphQLSchema({ 
    query: RootQuery, 
    mutation: RootMutation 
}); 

le schéma par défaut d'exportation;

UserType.js snippet

const UserType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'A user', 
    fields:() => ({ 
    id: globalIdField(), 
    _id: { 
     type: GraphQLID 
    }, 
    stores: { 
     type: StoreConnection, 
     resolve: (user) => StoreService.getStores(user) 
    }, 
    }), 

    interfaces: [nodeInterface] 
}); 

magasin-connexion-type.js

import { GraphQLObjectType, GraphQLList, GraphQLNonNull } from 'graphql'; 
import PageInfo from './page-info-type' 
import Cursor from './cursor-type' 
import StoreType from './store-type' 

const StoreEdge = new GraphQLObjectType({ 
    name: 'StoreEdge', 
    fields:() => ({ 
    cursor: { 
     type: Cursor, 
     resolve: (store) => ({ value: store._id.toString() }) 
    }, 
    node: { 
     type: StoreType, 
     resolve: (store) => store 
    }, 
    }), 
}); 

const StoreConnection = new GraphQLObjectType({ 
    name: 'StoreConnection', 
    fields:() => ({ 
    edges: { 
     type: new GraphQLList(StoreEdge), 
     resolve: (stores) => stores 
    }, 
    pageInfo: { 
     type: PageInfo, 
     resolve:() => ({hasNextPage: false, hasPreviousPage: false}) 
    }, 
    }), 
}); 

export default StoreConnection; 

GraphiQL Screenshot

+0

Pouvez-vous fournir la définition de votre type de Viewer à partir de votre schéma GraphQL? Je soupçonne que "magasins" est une liste, pas une connexion. – NevilleS

+0

@NevillS J'ai mis à jour la question avec plus d'informations. Toute aide est la bienvenue. Merci beaucoup. –

+0

OK, donc cela ressemble * * à votre champ 'stores' est une connexion GraphQL valide. Cependant, la logique de requête de mutation de relais n'est pas d'accord, elle doit donc agir sur des informations incomplètes. – NevilleS

Répondre

0

Il semble que la question (probable) est ici que la mutation logique de la construction des requêtes est confus par des informations incomplètes. Je soupçonne que cela ne va pas être facile pour votre grosse question - en théorie, les données devraient être accessibles dans le graphique local, mais je ne suis pas sûr à 100% à quel stade se déroulent ces types de validations défensives.

je recommande de mettre à jour votre requête de graisse pour être plus précis:

Relay.QL` 
     fragment on DeleteStoreMutationPayload { 
     viewer { 
      stores 
     } 
     deletedId 
     } 
` 

Je suis 50% sûr que est ce que config de mutation attend de voir quand vous lui donnez à la fois un parentName et un connectionName.

+0

Ouais, je suis presque sûr que c'est tout. Le message d'erreur pourrait être un peu plus utile ici (je pense que le problème est plus que "magasins" n'est pas dans la grosse question, pas que "magasins" n'est pas une connexion). Mais avoir des messages d'erreur super spécifiques n'est pas toujours facile à faire! – NevilleS

+0

J'ai essayé ce que vous suggérez, malheureusement l'erreur est toujours la même :( –

+0

OK, peut-être le type de mutation côté serveur est bancal.Pouvez-vous ajouter cela à la question aussi bien? – NevilleS

0

J'ai trébuché sur le correctif. StoreConnection ne prenait aucun argument, dans ce cas connectionArgs, à cause de quel relais ne le reconnaissait pas comme une connexion.

Correction du problème en ajoutant le champ connectionArgs to Stores.