Prisma API возвращает отношение, но клиент возвращает «не может вернуть null для поля, не допускающего значения NULL ..»

Когда я пытаюсь вернуть поля из отношения «один ко многим» на клиентской площадке Prisma, он возвращает следующую ошибку:

Cannot return null for non-nullable field DeviceConfig.device.

Что в моем резолвере или клиенте могло быть причиной этого?

При выполнении следующего запроса на серверной площадке Prisma API он возвращает правильные данные, которые говорят мне, что мои мутации и отношения хорошие.

Модель данных

type Device {
  ...
  model: String! @unique
  ...
  configs: [DeviceConfig] @relation(name: "DeviceConfigs", onDelete: CASCADE)
}

type DeviceConfig {
  id: ID! @unique
  device: Device! @relation(name: "DeviceConfigs", onDelete: SET_NULL)
  name: String!
  ...
}

Резольвер

deviceConfig: async (parent, { id }, context, info) => context.prisma.deviceConfig({ id }, info)

Запрос

{
  deviceConfig(id:"cjqigyian00ef0d206tg116k5"){
    name
    id
    device{
      model
    }
  }
}

Результат

{
  "data": null,
  "errors": [
    {
      "message": "Cannot return null for non-nullable field DeviceConfig.device.",
      "locations": [
        {
          "line": 5,
          "column": 5
        }
      ],
      "path": [
        "deviceConfig",
        "device"
      ]
    }
  ]
}

Я ожидаю, что запрос вернет модель устройства, как это делает сервер API Prisma. Запрос

{
  deviceConfig(where:{id:"cjqigyian00ef0d206tg116k5"}){
    name
    id
    device{
      id
      model
    }
  }
}

Результат

{
  "data": {
    "deviceConfig": {
      "name": "Standard",
      "id": "cjqigyian00ef0d206tg116k5",
      "device": {
        "id": "cjqigxzs600e60d20sdw38x7p",
        "model": "7530"
      }
    }
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
1 987
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы смешиваете синтаксис Наручники призмы с синтаксисом Клиент Prisma.

Объект info - это то, что вы передаете привязкам, чтобы вернуть то, что запрашивает пользователь. Однако эта функция недоступна в Prisma Client, которым вы, похоже, пользуетесь. Если вам нужна эта функция, вы можете попробовать Prisma Bindings.

В противном случае измените свой код на что-то вроде context.prisma.deviceConfig({ id }).device(). Думаю, он тоже может принять фрагмент context.prisma.deviceConfig({ id }).$fragment('fragment configWithDevice on DeviceConfig { id name device { id model } }').

Правильно, я перехожу с привязки Prisma и пропустил эту деталь. Я попробовал context.prisma.deviceConfig({ id }).device() и получил следующую ошибку: Cannot return null for non-nullable field DeviceConfig.name.. Было бы неплохо заставить это работать, чтобы мне не пришлось использовать решение для фрагментов. Но фрагмент сработал! Есть ли способ запросить все поля, не заполняя фрагмент всеми полями?

GerritVK 06.01.2019 17:22

Похоже, что первый синтаксис возвращает только «device by deviceConfig» (например, сообщения пользователя), но не саму конфигурацию устройства. Возможно, синтаксис фрагмента - единственная возможность: /

Fran Dios 07.01.2019 13:49

В этом есть смысл, спасибо за помощь.

GerritVK 07.01.2019 18:06
Ответ принят как подходящий

Это сообщение на форуме помогло мне понять некоторые предостережения, связанные с клиентом Prisma, когда дело касается резолверов. Помогите понять ценностное предложение клиента Prisma

В моем случае мне не хватало следующих револьверов, потому что я думал, что они будут подразумеваться на основе взаимосвязи схемы.

const resolvers = {
  // Relationship resolvers
  Device: {
    configs: (parent, args, context) => context.prisma.device({ id: parent.id }).configs(),
  },
  DeviceConfig: {
    device: (parent, args, context) => context.prisma.deviceConfig({ id: parent.id }).device(),
  },
  Query: {
    ...User.Query,
    ...Device.Query,
    ...DeviceConfig.Query,
  },
  Mutation: {
    ...User.Mutation,
    ...Device.Mutation,
    ...DeviceConfig.Mutation,
  },
};

Другие вопросы по теме