graphql передает динамические данные в мутацию - PullRequest
1 голос
/ 10 октября 2019

не использовал graphql или mongodb ранее. Как правильно передать объекты для мутации обновления?

Поскольку я вижу единственный способ передать несколько динамически появляющихся параметров, это использовать тип input, который мне кажется немного неэффективным (с точки зрения того, как это выглядит в коде, особенно с большими объектами), я просто передаю сами возможные значения. однако в этом случае мне нужно динамически построить updateObject, что опять-таки пойдет не так для больших моделей.

например, сейчас я сделал:

Mutation: {
        updateHub: async (_, { id, url, ports, enabled }) => {
            const query = {'_id': id};
            const updateFields = {
                ...(url? {url: url} : null),
                ...(ports? {ports: ports} : null),
                ...(enabled? {enabled: enabled} : null)
            };
            const result = await HubStore.findByIdAndUpdate(query, updateFields);
            return {
                success: !result ? false : true,
                message: 'updated',
                hub: result
            };
        }
}

любой совет получший способ справиться с этим?

спасибо!

1 Ответ

1 голос
/ 12 октября 2019

Похоже, что ваш код мог бы выиграть от использования синтаксиса расширения ES6 - он позволил бы вам иметь дело с произвольным числом свойств из вашего args объекта без необходимости в последовательных третичных операторах.

Mutation: {
        updateHub: async (_, { id, ...restArgs } ) => {
            const query = {'_id': id};
            const updateFields = { ...restArgs };
            const result = await HubStore.findByIdAndUpdate(query, updateFields);
            return {
                success: !result ? false : true,
                message: 'updated',
                hub: result
            };
        }
}

Если по какой-то причине вам нужно явно установить неопределенные свойства в свой объект null, вы можете использовать какой-нибудь config obj и метод, например defaults, из библиотеки lodash, как показано ниже:

import { defaults } from 'lodash';
const nullFill = { url: null, ports: null, enabled: null }; // include any other properties that may be needed

Mutation: {
        updateHub: async (_, { id, ...restArgs } ) => {
            const query = {'_id': id};
            const updateFields = defaults(restArgs, nullFill);
            const result = await HubStore.findByIdAndUpdate(query, updateFields);
            return {
                success: !result ? false : true,
                message: 'updated',
                hub: result
            };
        }
}

Кроме того, FWIW, я хотел бы рассмотреть возможность размещения динамических аргументов, которые потенциально могут быть обновлены, на свой собственный тип ввода, такой как HubInput в этом случае, как предложено в документах graphql . Ниже я показал, как это может работать с вашей мутацией. Обратите внимание, что поскольку ничто в HubInput не помечено как Requird (!), вы можете передать динамический набор свойств для обновления. Также обратите внимание, что если вы возьмете это appraoch, вам нужно будет должным образом деструктурировать ваш объект args изначально в вашей мутации, что-то вроде { id, input }.

    input HubInput {
       url: String
       ports: // whatever this type is, like [String]
       enabled: Boolean
       // ...Anything else that might need updating
     }

     type UpdateHubPayload {
        success: Boolean
        message: String
        hub: Hub // assumes you have defined a type Hub
     }

     updateHub(id: Int, input: HubInput!): UpdateHubPayload
...