如何在Relay中动态更改网络层

时间:2016-06-14 06:57:18

标签: graphql relay

我知道,如下所述,中继可以注入网络层:

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

但是如果我需要稍后告诉标题是什么(比如登录后)呢?

3 个答案:

答案 0 :(得分:4)

我发现了一个简单的伎俩。您可以传入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=='

答案 1 :(得分:3)

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

加载应用时,您可以执行以下操作:

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

答案 2 :(得分:2)

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