You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Graphcool的GraphQL用户类型模型中定义嵌套对象字段?

嘿,我来帮你搞定这个问题!根据你的需求,有两个实用方案可选,取决于你想怎么存储Facebook返回的图片数据:

方案1:只存储图片URL(推荐)

大多数场景下我们只需要图片的实际访问链接,所以直接把facebookPicture定义为String类型就够用了,简洁又实用:

type User @model {
  # Required system field:
  id: ID! @isUnique # read-only (managed by Graphcool)
  # Optional system fields (remove if not needed):
  createdAt: DateTime! # read-only (managed by Graphcool)
  updatedAt: DateTime! # read-only (managed by Graphcool)
  facebookUserId: String @isUnique
  facebookEmail: String
  facebookName: String
  facebookPicture: String # 定义为字符串类型,存储图片URL
  posts: [Post!]! @relation(name: "UserPosts")
}

对应的JavaScript函数里,你需要调整取值路径,拿到嵌套在picture.data里的url,建议加个空值判断避免报错:

function createGraphcoolUser(facebookUser) {
  const pictureUrl = facebookUser.picture?.data?.url || '';
  
  return api.request(`
    mutation {
      createUser(
        facebookUserId: \"${facebookUser.id}\"
        facebookEmail: \"${facebookUser.email}\"
        facebookName: \"${facebookUser.name}\"
        facebookPicture: \"${pictureUrl}\"
      ) {
        id
      }
    }`)
  .then((userMutationResult) => {
    return userMutationResult.createUser.id
  })
}

方案2:存储完整的嵌套结构

如果你需要保留Facebook返回的完整图片对象结构,可以自定义嵌套类型来匹配这个结构:

首先定义两个辅助类型:

type FacebookPictureData {
  url: String!
}

type FacebookPicture {
  data: FacebookPictureData!
}

然后修改User模型,把facebookPicture字段指定为自定义的FacebookPicture类型:

type User @model {
  # ... 其他原有字段保持不变
  facebookPicture: FacebookPicture # 使用自定义嵌套类型
  posts: [Post!]! @relation(name: "UserPosts")
}

对应的函数里,要按照GraphQL的嵌套格式传入参数,同样建议做空值处理:

function createGraphcoolUser(facebookUser) {
  const pictureData = facebookUser.picture?.data || { url: '' };
  
  return api.request(`
    mutation {
      createUser(
        facebookUserId: \"${facebookUser.id}\"
        facebookEmail: \"${facebookUser.email}\"
        facebookName: \"${facebookUser.name}\"
        facebookPicture: {
          data: {
            url: \"${pictureData.url}\"
          }
        }
      ) {
        id
      }
    }`)
  .then((userMutationResult) => {
    return userMutationResult.createUser.id
  })
}

小提示

  • 优先选方案1,因为存储URL足够满足绝大多数业务需求,后续查询和使用都更方便
  • 空值判断很重要,避免Facebook返回的数据里缺失picture字段导致代码报错

内容的提问来源于stack exchange,提问作者Gab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:38:16