Простой вложенный запрос GraphQL, возвращающий нулевое поле - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь изучить GraphQL (& node.js, MongoDB и т. Д.).Я не могу получить этот простой вложенный запрос для возврата результатов:

query getLocationByPerson {
   People {
      firstName
        lastName
        service {
        location
      }
   }
}

Результат, который я получаю:

{
  "data": {
    "People": [
      {
        "firstName": "John",
        "lastName": "DOE",
        "service": null
      }
    ]
  },
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Service.location.",
      "locations": [
        {
          "line": 6,
          "column": 7
        }
      ],
      "path": [
        "People",
        0,
        "service",
        "location"
      ]
    }
  ]
}

Весь код доступен здесь: https://github.com/fabricezerrouki/graphql-playground Может кто-нибудьпосмотрите и помогите мне понять, что я делаю не так?Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

Проблема заключается в том, как вы устанавливаете атрибут службы при создании и обновлении человека.Для вложенных типов вы хотите передать объект, содержащий подтипы.Прямо сейчас вы передаете ему просто строку, поэтому, когда вы пытаетесь установить Service равным args.serviceId в вашем преобразователе createPerson, он не существует, и поэтому устанавливает значение этого поля в NULL в MongoDB.Рефакторинг, например, так:

In index.js

type Mutation {
  createPerson(Xid: String!, firstName: String */ ... */ service: { id: ID!, name: String!, location: String! }): People!
}

In /resolvers/Mutation.js

const Mutations = {

  createPerson: async (parent, args) => {
    const newPerson = new People({
      Xid: args.Xid,
      firstName: args.firstName
      /* and so on... */
      Service: args.service.id
    });
  }

}

Кроме того, вы можете столкнуться с проблемами в будущем, учитывая способ сохранения объекта Service в MongoDB в качестве службы с прописной буквой «S», тогда как ваша переменная в запросах - это служба с строчными буквами «s».Вам нужно будет помнить каждый раз, когда вы будете искать в базе данных, чтобы теперь непосредственно деструктурировать args.service в ваш метод Model.find ({service}).Вроде нишевая проблема, но я сам столкнулся с этой проблемой, так что подумал, что упомяну ее.

Отредактировано в ответ на комментарий OP

Да, это такМожно выполнить операцию соединения SQL-соединения, чтобы вернуть объект Service с запросом Person, но вам нужно сделать это в обработчике запросов и просто сохранить идентификатор Service во время мутации.В этом случае, я думаю, причина, по которой он нулевой, заключается в том, что вы вызываете args.serviceId, но параметр createPerson () просто "service", поэтому попробуйте изменить Mutation.js на Service: args.service.

Что касается фактической операции соединения,это немного сложнее.Я бы порекомендовал сначала вернуть строку serviceId, чтобы убедиться, что она работает правильно.Затем вам нужно углубиться в конвейер агрегации MongoDB .В частности, оператор конвейера поиска $ выполняет функцию, подобную соединению SQL.Я в конечном итоге бью себя головой о стену каждый раз, когда мне приходится сталкиваться с трубопроводами агрегации.Это довольно сложная тема с запутанным синтаксисом IMO.Но есть множество учебных пособий и примеров для того, чтобы делать именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...