更新商店上的查看器字段和连接

时间:2018-04-05 09:14:31

标签: graphql relayjs

我正在尝试更新中继商店中当前查看器的值和连接。

因此,如果我打印,则不调用变异signIn:

console.log(viewer.name) // "Visitor"
console.log(viewer.is_anonymous) // true

在Mutations上我们得到了方法更新器,它给了我们商店,所以在我的变异中我做的是这样的:

mutation SignInMutation($input: SignInInput!){
  signIn(input: $input){
      user {
          id
          name
          email
          is_anonymous
          notifications{
              edges{
                  node {
                      id
                      ...NotificationItem_notification
                  }
              }
          }
      }
      token
  }
}

所以我的更新程序方法有:

const viewer = store.get(viewer_id);
const signIn = store.getRootField('signIn');
viewer.copyFieldsFrom(signIn.getLinkedRecord('user'))

在此之后我更新了商店我得到了名称电子邮件is_anonymous字段更新了来自graphql端点的数据(我的意思是现在名字是“Erick”,is_anonymous现在是假的,这很棒)但是如果我尝试做viewer.notifications并渲染它,即使有通知,viewer.connections的长度似乎也是0。

如何更新当前查看器并将MutationPayload中的通知添加到商店中而无需强制获取?

我正在使用最新的relay-modern和graphql。

PS:对不好的形成感到抱歉,但是按照OF要我的方式格式化代码是不可能的,我把它格式化为4个空格并且仍然给了我错误。

1 个答案:

答案 0 :(得分:0)

通过重新组织GraphQL模式,可能会消除登录突变后直接与中继存储进行交互的需要。考虑:

viewer {
  id
  currentUser {
    name
    email
  }
}

当没有登录的用户时,currentUser将返回null

然后您可以将登录突变修改为:

mutation SignInMutation($input: SignInInput!){
  signIn(input: $input){
      viewer {
        id
        currentUser {
          name
          email
          token
        }
      }
  }
}

了解currentUser字段的“可空性”为确定用户是否登录提供了一种优雅的方法。

基于token字段的存在表示您正在使用JWT或类似的方法来跟踪登录状态。您需要将该令牌存储在本地存储中,并将其附加到GraphQL端点的传出中继请求的标头中。

令牌本身的存储必须在发出突变请求的onCompleted回调中完成(您可以在回调函数的参数中访问服务器返回的有效负载)。

作为令牌的替代方法,您还可以探索使用cookie,该cookie可以提供相同的用户体验,但是与JWT令牌相比,可能需要更少的工作。