2015-12-03 21 views
11

Tôi muốn gửi yêu cầu đột biến graphql mà không phụ phầnGraphQL đột biến mà không phụ phần

mutation _ { 
    updateCurrentUser(fullName: "Syava", email: "[email protected]") 
} 

và tôi nhận được

{ 
    "errors": [ 
    { 
     "message": "Field \"updateCurrentUser\" of type \"User\" must have a sub selection.", 
     ... 
    } 
    ] 
} 

add {id} để yêu cầu hoạt động tốt nhưng tôi không muốn

Đồng thời Mã lược đồ

const userType = new GraphQLObjectType({ 
    name: 'User', 
    fields:() => ({ 
    id: { type: new GraphQLNonNull(GraphQLString) }, 
    fullName: { type: GraphQLString }, 
    email: { type: GraphQLString }, 
    }), 
}); 

type: userType, 
    args: { 
    fullName: { type: GraphQLString }, 
    email: { type: new GraphQLNonNull(emailType) }, 
    password: { type: GraphQLString }, 
    }, 
    resolve: async (root, { fullName, email, password }, { rootValue }) => { 
    const user = await User.findById(rootValue.req.user.id); 

    ... 

    return user; 
    }, 

Trả lời

7

Bạn xác định loại trường là Loại người dùng. Mặc dù đó là một đột biến, nó vẫn tuân theo các quy tắc và hành vi giống như một truy vấn. Bởi vì UserType là một kiểu đối tượng, nó đòi hỏi các trường lồng nhau.

mutation _ { 
    updateCurrentUser(fullName: "Syava", email: "[email protected]") { 
    fullName 
    email 
    } 
} 
// would respond with { fullName: 'Syava', email: '[email protected]' } 

Nếu bạn không muốn đột biến trả về Người dùng, bạn có thể khai báo loại của nó thành GraphQLBoolean chẳng hạn - đó là vô hướng và không có bất kỳ trường lồng nhau nào.

{ 
    type: GraphQLBoolean, 
    args: { 
    fullName: { type: GraphQLString }, 
    email: { type: new GraphQLNonNull(emailType) }, 
    password: { type: GraphQLString }, 
    }, 
    resolve: async (root, { fullName, email, password }, { rootValue }) => { 
    const user = await User.findById(rootValue.req.user.id); 
    user.fullName = fullName; 
    user.password = password; // or hashed to not store plain text passwords 
    return user.save(); // assuming save returns boolean; depends on the library you use 
    } 
} 
+0

Bạn có thể làm cho câu trả lời này dễ hiểu hơn bằng cách thêm ví dụ lược đồ graphql hoặc định nghĩa kiểu graphql-js? – cpz

+0

Trong trường hợp đột biến này được gọi từ một số phần của mã, có thể đôi khi phản hồi phải thuộc loại: "userType" và một số lần khác không cần phản hồi. Có cách nào để nhận phản hồi "userType" tùy chọn và dữ liệu lựa chọn phụ theo các ràng buộc của khách hàng không ?? –

+0

Với 'type: userType', server cho biết nó trả về một người dùng * * null (với' type: GraphQLNonNull (userType) ', người dùng sẽ được bảo đảm có mặt). Bất kể, máy chủ cần chỉ định cách tìm nạp người dùng. Nếu nó có thể là 'null' cho một số trường hợp nhất định, máy khách phải chắc chắn trước khi truy cập các thuộc tính của nó. > theo các ràng buộc của máy khách Máy khách không thể hạn chế kiểu trả về. Những gì bạn có thể làm là yêu cầu 'updateCurrentUser (...) {id}' và đơn giản là bỏ qua những gì được trả về. Nhưng bạn không thể yêu cầu 'updateCurrentUser (...)' không có thuộc tính. –

Các vấn đề liên quan