Правильный способ объявления полей для Prisma, предоставляемый GraphQL Yoga, но не обязательный для распознавателя - PullRequest
0 голосов
/ 04 сентября 2018

Я пытался найти некоторую документацию по этому вопросу на веб-сайтах Prisma, но, честно говоря, там довольно сложно найти очень подробные примеры использования, особенно когда проблему описать так же сложно, как этот.

У меня есть ситуация, когда мой интерфейс отправляет запрос мутации на createPosting на моем сервере GraphQL-Yoga с полями positionTitle, employmentType, description, requirements, customId, expiresAt (я тщательно проверил, что это работает, как и ожидалось). Я хочу добавить поле createdAt перед созданием узла в службе Prisma.

На моем сервере GraphQL-Yoga есть datamodel.graphql, который включает в себя следующее:

type Posting {
  id: ID! @unique
  customId: String! @unique
  offeredBy: Employer!
  postingTitle: String!
  positionTitle: String!
  employmentType: EmploymentType!
  status: PostingStatus!
  description: String
  requirements: String
  applications: [Application!]!
  createdAt: DateTime!
  expiresAt: DateTime!
}

В моем schema.graphql это есть в разделе Мутации:

createPosting(postingTitle: String!,
    positionTitle: String!,
    employmentType: String!,
    description: String!,
    requirements: String!,
    customId: String!,
    expiresAt: DateTime!,
    status: PostingStatus): Posting!

Наконец, в моем преобразователе createPosting я пытаюсь изменить бэкэнд Prisma следующим образом:

const result = await context.prisma.mutation.createPosting({
    data: {
      offeredBy: { connect: { name: context.req.name} },
      postingTitle: args.postingTitle,
      positionTitle: args.positionTitle,
      employmentType: args.employmentType,
      description: args.description,
      requirements: args.requirements,
      customId: args.customId,
      createdAt: new Date().toISOString(),
      expiresAt: expiresAt,
      status: args.status || 'UPCOMING'
    }
  })

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

Error: Variable '$_v0_data' expected value of type 'PostingCreateInput!' but got: {"customId":"dwa","postingTitle":"da","positionTitle":"da","employmentType":"PART_TIME","status":"UPCOMING","description":"dada","requirements":"dadada","expiresAt":"2018-09-27T00:00:00.000Z","createdAt":"2018-09-04T20:29:10.745Z","offeredBy":{"connect":{"name":"NSB"}}}. Reason: 'createdAt' Field 'createdAt' is not defined in the input type 'PostingCreateInput'.

Из этого сообщения об ошибке я бы предположил, что мой сервис Prisma по какой-то причине не знает о createAt, так как я недавно добавил это поле, но когда я проверяю тип Posting и PostingCreateInput на площадке GraphQL на хосте Prisma, я нахожу поле создано на! в обоих этих местах.

Я попытался удалить созданный файл prisma.graphql и снова развернуть его для нового файла, но это не сработало. И когда я проверял prisma.graphql, PostingCreateInput действительно пропустил поле createAt, хотя, кажется, оно есть на сервере Prisma.

Если кто-то может указать мне правильное направление относительно того, что не так, или дать мне лучшее представление о том, как настроить переменные, которые должны храниться в базе данных, но создаваться на моем сервере йоги, а не в конец я был бы очень благодарен :) 1026 *

Хотя этот вопрос может показаться немного конкретным, я считаю, что идея создания данных для полей во время на сервере должна быть возможной до создания узлов, но в данный момент я пытаюсь обдумать, как это сделать.

TLDR; Хотите создать поле createdAt:DateTime на моем сервере GraphQL-Yoga в резольвере, прежде чем отправлять запрос на создание в службу Prisma.

1 Ответ

0 голосов
/ 05 сентября 2018

Хорошо, так что после долгой работы, опробовав разные стратегии, я наконец попытался изменить имя поля с createdAt на createdDate, и теперь оно работает.

Просматривая игровую площадку, я обнаружил, что createdAt - это полускрытое защищенное поле, используемое самой Prisma для запроса сортировки по запросам. Его можно найти под выбором orderBy в списке Аргументы для одной записи данных.

Сообщение об ошибке Reason: 'createdAt' Field 'createdAt' is not defined in the input type 'PostingCreateInput'., конечно, ни в коем случае не указывало мне правильное направление.

TLDR; Проблема заключалась в том, что я назвал свое поле createdAt, которое является именем защищенного поля.

...