2016-01-28 49 views
0

我使用graphql-relay定義了GraphQL突變,但在解決如何向其提交突變時遇到問題。將突變提交給graphql-relay突變的語法WithClientMutationId

下面是相關的模式:

const userType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'user', 
    fields:() => ({ 
    id: { 
     type: new GraphQLNonNull(GraphQLString), 
     description: 'The UUID for the user.', 
     resolve(user) { 
     return user.uuid; 
     }, 
    }, 
    }) 
}); 

const registerUser = mutationWithClientMutationId({ 
    name: 'registerUser', 
    inputFields: { 
    }, 
    outputFields: { 
    user: { 
     type: userType, 
     resolve: (payload) => { 
     models.user.findById(payload.userId); 
     } 
    }, 
    }, 
    mutateAndGetPayload: (args) => { 
    var newUser = models.user.build().save(); 
    return { 
     userId: newUser.id, 
    }; 
    } 
}); 


const rootMutation = new GraphQLObjectType({ 
    name: 'RootMutationType', 
    fields: { 
    registerUser: registerUser, 
    }, 
}); 

const schema = new GraphQLSchema({ 
    query: rootQuery, 
    mutation: rootMutation, 
}); 

我應該HTTP調用模樣註冊一個新用戶,並取回用戶id?

謝謝!

回答

0

我想通了,工作了突變格式:

mutation RootMutationType { 
    registerUser(input:{clientMutationId:"123"}){ 
    clientMutationId, user { id } 
    } 
} 
1

我想指出,我看到你說你的變異不需要參數 - 它怎麼知道新用戶的細節是什麼?最終你可能需要一些關於這種突變的參數。在第一個函數參數中,它們可用於您的mutateAndGetPayload。 (我不是說每個突變都需要參數,但是這個可能是這樣的)

如果您使用的是Relay,關於official document有關於如何使用來自Relay的突變的一些相當不錯的信息。特別是在顯示各種增變器配置的底部。如果您正在使用連接,則可能需要使用RANGE_ADD手動將此新帳戶添加到中繼商店,否則,如果您想執行更廣泛的重新訪問,則可以使用FIELDS_CHANGE。你說在突變結束後你需要新的用戶ID。如果您使用中繼,則可能需要查看REQUIRED_CHILDREN以指定無論計算的中繼將構建的查詢如何,您總是需要查詢該ID。

你突變的輸出是一個userType,所以你能夠與有效載荷類型的片段,這很可能是RegisterUserPayload訪問它,這可能看起來像......

fragment on RegisterUserPayload { 
    user { 
    id 
    } 
} 

現在,假設您使用了中繼。如果您想通過GraphiQL手動嘗試此操作,那麼您可以使用在GraphQL Mutation docs上通過那裏進行突變的示例。有一個你如何查詢你的突變的直接例子。

最後,既然您問過如何在低層次上自己發出HTTP請求,那麼您可以查看express-graphql文檔,which explains如何查詢它。

+0

有道理。謝謝瑞恩! –