【发布时间】:2018-02-01 08:16:50
【问题描述】:
我正在使用 React-Relay 和 Found。当用户注销时,应正确刷新 Relay Store 作为安全措施。
显然,推荐的过程是实现一个可重置对象。
这是我的可复位继电器(遵循found-relay#42 的建议):
ResettableRelay.js
import {Environment, Network, RecordSource, Store} from "relay-runtime";
import {Resolver} from "found-relay";
function fetchQuery(operation, variables, cacheConfig, uploadables) {
return fetch("/graphql", {
method: "POST",
headers: headers,
body: JSON.stringify({
query: operation.text, // GraphQL text from input
variables,
}),
}).then(response => {
return(response.json());
});
}
class ResettableRelay {
environment = null;
resolver = null;
constructor() {
this.reset();
}
reset = function () {
const source = new RecordSource();
const environment = new Environment({
store: new Store(source),
network: Network.create(fetchQuery)
});
this.environment = environment;
this.resolver = new Resolver(environment);
console.log("Reset!");
}
}
const currentRelay = new ResettableRelay();
export default currentRelay;
这是我的 index.js:
index.js
import currentRelay from "./ResettableRelay";
import Routes from "./Routes";
const Router = createFarceRouter({
historyProtocol: new BrowserProtocol(),
historyMiddlewares: [queryMiddleware],
routeConfig: Routes,
render: createRender({})
});
const mountNode = document.getElementById("root");
ReactDOM.render(
<Router
resolver={currentRelay.resolver}
/>, mountNode);
这是来自嵌套在 Routes.js 中的我的应用程序:
onLogout = () {
clearLoginToken();
console.log(currentRelay.environment);
currentRelay.reset();
console.log(currentRelay.environment); //These two logged relay environments are different!
this.forceUpdate(); //Not sure if I need this
}
我仍然无法使用上述方法。注销时,即使环境属性已重置,解析器属性也不会更新其环境。此外,{viewer} 中继查询不会在登录或注销时更新。它只会在后续查询中更新。
【问题讨论】:
-
我也有同样的担忧......我刚刚在 Discord 的#relay 频道上 ping @taion 来帮助我们