Relay中如何动态改变网络层

How to dynamically change the network layer in Relay

我知道中继可以在引导时注入网络层,如下所示:

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('http://example.com/graphql', {
    headers: {
      Authorization: 'Basic SSdsbCBmaW5kIHNvbWV0aGluZyB0byBwdXQgaGVyZQ==',
    },
  })
);

但是,如果我稍后(比如登录后)需要告诉我 header 是什么怎么办?

好问题。我想您正在您的基础组件文件中设置网络层。您可以创建一个函数来包装 Relay.injectNetworkLayer 调用,以便在需要时更新 Auth header。

加载应用程序时,您可以这样做:

export function setNetworkLayer() {
  return new Promise((resolve, reject) => {

      var options = {};
      if (localStorage.authToken) {
        options.headers = {
          Authorization: 'Basic ' + localStorage.authToken
        }
      }
      else {
        options.headers = {};
      }
      Relay.injectNetworkLayer(
        new Relay.DefaultNetworkLayer('http://example.com/graphql', options)
      );
      resolve(options);
    });
  })
}

如果你想更新网络层,你会做这样的事情:

loginUser().then((res) => {
    localStorage.authToken = res.token;
    setNetworkLayer();
    return;
})

我在 github 中继回购中问了这个问题,他们推荐我使用这个 react-relay-network-layer 库来解决问题。我相信这将是解决问题的最佳选择。

我发现了一个简单的技巧。您可以传入 headers 对象并更新其指针值。

const headers = {
    Authorization: '',
};

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('http://example.com/graphql', {
    headers: headers,
  })
);

// To update the authorization, set the field.

headers.Authorization = 'Basic SSdsbCBmaW5kIHNvbWV0aGluZyB0byBwdXQgaGVyZQ=='