Как сохранить число переменных Dynami c в базу данных, используя graphql? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь изменить и запросить динамические c переменные. Пользователь может добавить столько переменных, сколько он хочет, прежде чем отправлять их на сервер. Например, мое приложение представляет собой приложение для повышения производительности, которое позволяет пользователю добавлять столько метрик, сколько они хотят, чтобы отслеживать свою цель, поэтому, если целью является «Тренажерный зал», метрики будут «бегать», «жим лежа» и т. Д. c. Моя проблема в том, что я не уверен, как сохранить их в базе данных, так как нет предварительно настроенной схемы для этих пользовательских переменных.

Мне удалось отправить переменные на сервер, используя следующее:

mutation CreateGoal ($title: String!, $description: String, $metric: [Json!]) {
    createGoal(
      data: {
        title: $title
        description: $description
        metric: { set: $metric }
    }
    ){
      id
    }
  } 

Схема:

type Mutation { 
    createGoal(data: CreateGoalInput!): Goal!
}

input CreateGoalInput {
    title: String!
    description: String
    metric: GoalCreatemetricInput
}

input GoalCreatemetricInput {
  set: [Json!]
}

Как только переменные попадают в преобразователь, они имеют формат Json:

{ set: [ 'running', 'bench press' ] }

Обычно я просто сохраните переменные через Prisma:

 async createGoal(parent, { data }, { request, prisma }, info) {
        const { title, description, metric } = data && data
        return prisma.mutation.createGoal({
            data: {
                user: {
                    connect: {
                        email: user.email
                    }
                },
                title,
                description,
            }
        }, info)
    },

Однако, поскольку число переменных неизвестно, как мне сохранить 'metri c' в моей базе данных?

Если бы я попробовал следующее:

 async createGoal(parent, { data }, { request, prisma }, info) {
        const { title, description, metric } = data && data
        return prisma.mutation.createGoal({
            data: {
                user: {
                    connect: {
                        email: user.email
                    }
                },
                title,
                description,
                metric,
            }
        }, info)
    },

Я получаю ошибку:

Ошибка: переменная "$ _v0_data" получила недопустимое значение ["выполняется", "жим лежа" ] в "_v0_data.metri c"; Поле "0" не определено типом GoalCreatemetricInput.

Если бы я попытался:

 async createGoal(parent, { data }, { request, prisma }, info) {
        const { title, description, metric } = data && data
        return prisma.mutation.createGoal({
            data: {
                user: {
                    connect: {
                        email: user.email
                    }
                },
                title,
                description,
                metric: metric.set
            }
        }, info)
    },

Я получаю ошибку:

Ошибка : Переменная "$ _v0_data" получила недопустимое значение ["выполняется", "жим лежа"] в "_v0_data.metri c"; Поле "0" не определено типом GoalCreatemetricInput. Переменная "$ _v0_data" получила недопустимое значение ["Asdfasdf", "Asdfasdf"] в "_v0_data.metri c"; Поле "1" не определено типом GoalCreatemetricInput.

1 Ответ

0 голосов
/ 30 января 2020

Не думаю, что вам вообще нужно использовать скаляр Json. Похоже, вы пытаетесь передать массив строк, поэтому вместо [Json!] вам может понадобиться просто использовать [String!].

input CreateGoalInput {
    title: String!
    description: String
    metric: [String!]
}

Тогда вы сможете избавиться от

input GoalCreatemetricInput {
  set: [Json!]
}

Здесь вы должны быть в состоянии передать массив строк в бэкэнд:

mutation CreateGoal ($title: String!, $description: String, $metric: [String!]) {
    createGoal(
      data: {
        title: $title
        description: $description
        metric: $metric 
    }
    ){
      id
    }
  } 

И в вашем преобразователе я думаю, все, что вам нужно сделать, это:

async createGoal(parent, { data }, { request, prisma }, info) {
        const { title, description, metric } = data && data
        return prisma.mutation.createGoal({
            data: {
                user: {
                    connect: {
                        email: user.email
                    }
                },
                title,
                description,
                metric: { set: metric },
            }
        }, info)
    },
...