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=='
我知道中继可以在引导时注入网络层,如下所示:
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=='