【发布时间】:2021-05-21 22:29:10
【问题描述】:
我正在尝试将用户集合中的变量保存到客户端,以便我可以使用它,但我不希望客户端能够更改该变量。我如何做到这一点?
目前我有这个,但它一直在打开和关闭,因为它在渲染时并不总是从集合中获取变量:
function AdminMenu() {
const user = useTracker(() => Meteor.user());
if (user.admin) {
return (
<div>isAdmin</div>
);
} else {
return (<div/>);
}
}
我可以让它按照我想要的方式工作,但我担心客户端能够编辑变量:
let isAdmin = false;
function AdminMenu() {
const user = useTracker(() => Meteor.user());
if (user.admin) {
isAdmin = true;
}
if (isAdmin) {
return (
<div>isAdmin</div>
);
} else {
return (<div/>);
}
}
实现这一目标的最佳方法是什么? 提前致谢!
【问题讨论】:
-
客户端的本质是它不安全,因此始终可以编辑变量。重要的是您只信任在服务器上执行的代码,从不信任客户端提供的未经验证的数据。至于变量切换,这是因为订阅还没有准备好。一般来说,您需要等待您的数据所依赖的任何订阅准备就绪,然后再渲染依赖该数据的组件部分。
-
啊,是的,所以我在服务器上创建了一个方法来检查用户是否是管理员。这就说得通了。感谢您的信息!
-
嗯,我似乎无法让它工作,因为调用方法有延迟,但目前我只将 user.admin 发送给具有价值和订阅的用户.ready() 函数似乎可以工作。客户端是否能够更改用户集合的值或添加到用户集合中?
-
可以从订阅句柄中获取就绪状态。
-
如果您愿意,请随时访问 Meteor Community Slack 工作区,我们可以讨论解决此问题的更多策略meteor-community.slack.com/join/shared_invite/…