Prisma API返回关系,但客户端返回“无法为非空字段返回null。”

时间:2019-01-04 23:07:52

标签: javascript graphql prisma

当我尝试从Prisma客户端游乐场中的一对多关系返回字段时,它返回以下错误:

  

不能为非空字段DeviceConfig.device返回null。

在我的解析器或客户端中可能是什么引起的?

在后端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"
      ]
    }
  ]
}

我希望查询能够像后端Prisma API服务器一样返回设备的模型 查询

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

结果

{
  "data": {
    "deviceConfig": {
      "name": "Standard",
      "id": "cjqigyian00ef0d206tg116k5",
      "device": {
        "id": "cjqigxzs600e60d20sdw38x7p",
        "model": "7530"
      }
    }
  }
}

2 个答案:

答案 0 :(得分:3)

我认为您正在将Prisma Bindings语法与Prisma Client语法混合使用。

info对象是传递给绑定以返回用户要求的内容。但是,您似乎正在使用的Prisma Client中没有此功能。如果您需要该功能,则可以尝试Prisma绑定。

否则,将您的代码修改为context.prisma.deviceConfig({ id }).device()。我认为它也可以接受片段context.prisma.deviceConfig({ id }).$fragment('fragment configWithDevice on DeviceConfig { id name device { id model } }')

答案 1 :(得分:2)

此论坛帖子帮助我了解了有关解析器的有关Prisma客户的一些注意事项。 Help Understanding Prisma Client’s Value Proposition

在我的情况下,我缺少以下左轮手枪,因为我认为基于架构关系会隐含它们。

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,
  },
};