Результат useMutation, возвращающий странную структуру / не возвращающий запрошенные поля - PullRequest
0 голосов
/ 27 марта 2020

Что я пытаюсь сделать: с помощью useMutation для отправки массива массива в mongoDB.

Что случилось: он успешно сохранил в mongoDb и в правильном формате НО «result.data» useMutation не так, как ожидалось, слишком устало для быть использованным.

Это мой массив массивов (конечно, он начинался как пустой массив и выдвигался, когда пользователь добавляет привлекательность дням в своем маршруте).

let itinerary = [{placeIds: ["ChIJafBhcoVPqEcRb7rHEy3G0L8", "ChIJBRk3gUlOqEcR9oEBV-dqK5M"]},
{placeIds: ["ChIJx8Iw5VFOqEcRXUgfWxkmAaA", "ChIJSdWeck5OqEcReSTr3YfoSuE"]}, 
{placeIds: ["ChIJ1WCXcFJOqEcRBR_ICa3TemU"]}]

Это мутация graphql:

const SUBMIT_ITINERARY =  gql`
        mutation submitItinerary(
            $dayPlans: [DayPlanInput]
        ){
            submitItinerary(
                dayPlans: $dayPlans
            ){
                id
                dayPlans{
                    placeIds
                }
                createdAt
            }
        }
    `

Это использование крюка реакции apolloMutation:

const [submitItinerary] = useMutation(SUBMIT_ITINERARY, {
        update(result){
            console.log(result.data);
        },
        onError(err){
            console.log(err)
        },
        variables: {
            dayPlans: itinerary
        }
    })

на моей игровой площадке graphql я получил это screenshot of graphql

Так что я подумал, что в моем интерфейсе я получу нечто подобное, но вместо этого я получил это: screenshot of frontend console

Почему это так? Я хочу чтобы получить структуру, похожую на то, что я получил на детской площадке graphql.


Дополнительные сведения, которые могут быть полезны: Вот моя схема маршрута:

const itinerarySchema = new Schema({
    city: String,
    username: String,
    createdAt: String,
    dayPlans: [],
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users',
    }
});

определения моего типа:

type DayPlan {
    placeIds: [String]!
}
type Itinerary {
    id: ID!
    dayPlans: [DayPlan]!
    username: String!
    createdAt: String!
}
input DayPlanInput {
    placeIds: [String]
}
input RegisterInput {
    username: String!
    password: String!
    confirmPassword: String!
    email: String!
}
type Query {
    getUsers: [User]
}
type Mutation {
    register(registerInput: RegisterInput): User!
    login(username: String!, password: String!): User!
    submitItinerary(dayPlans: [DayPlanInput] ): Itinerary!
}

и мой отправитель. Маршрутизатор:

Mutation: {
        async submitItinerary(_, {dayPlans}, context) {
            const user = checkAuth(context);
            //console.log(user);

            if (dayPlans.length === 0){
                throw new Error('Itinerary should not be empty');
            }

            const newItinerary = new Itinerary({
                dayPlans,
                user: user.id,
                username: user.username,
                createdAt: new Date().toISOString()
            })

            const submitted = await newItinerary.save()

            return submitted;
        }
    }

1 Ответ

2 голосов
/ 27 марта 2020

Первая переменная update в useMutation - это сам кэш Apollo, а не результат мутации. Результат мутации можно найти во втором параметре. Здесь вы можете найти документы API.

Это должно записать правильные данные:

const [submitItinerary] = useMutation(SUBMIT_ITINERARY, {
    update(cache, result){
        console.log(result.data);
    },
    onError(err){
        console.log(err)
    },
    variables: {
        dayPlans: itinerary
    }
})

Также еще один способ получить доступ к результату мутации - использовать второй элемент из возвращаемое значение хука:

const [submitItinerary, { data, loading, error }] = useMutation(SUBMIT_ITINERARY)
...