我的Meteor应用程序中有一个使用React组件构建的用户个人资料页面。因为它使用Meteor.user()来创建其中一个变量,所以每当我退出应用程序时都会收到错误(但前提是我之前访问过当前会话中的配置文件页面)。它确实对我有意义,因为没有当前用户,Meteor.user()不再可用,因此它会出错,并且无法读取'支持'未定义"消息。
AccountList = React.createClass({
mixins: [ReactMeteorData],
getMeteorData(){
var user;
var supportingUserId = Meteor.user().support.supportingUserId;
supportingUserId ? user = Meteor.users.findOne({_id: supportingUserId}) : user = Meteor.user();
return {
accounts: Accounts.find({owner: user._id}).fetch()
}
}...
最初,我尝试更改上面的代码块,将违规代码包装在if语句中,如下所示:
AccountList = React.createClass({
mixins: [ReactMeteorData],
getMeteorData(){
var user;
if (Meteor.user()){
var supportingUserId = Meteor.user().support.supportingUserId;
supportingUserId ? user = Meteor.users.findOne({_id: supportingUserId}) : user = Meteor.user();
return {
accounts: Accounts.find({owner: user._id}).fetch()
}
}
else{
return {};
}
}...
但是我遇到了另一个错误:"无法读取属性'长度'未定义"这是由未定义的帐户引起的(由另一个需要'帐户'进一步向下的渲染方法触发)。我最终采用相同的方法并添加了额外的if语句,但遇到了另一个类似的错误。我的问题是,是否可以解决这个问题,而不必将应用程序中的一半包裹在" if(Meteor.user())"声明。或者,是否有可能在注销时清除应用程序以记住加载的React组件?
答案 0 :(得分:0)
尝试
return {accounts: []};
而不是
return {};
并且绝不假设accounts.length > 0
。
答案 1 :(得分:0)
Michel Floyd的方式是正确的!
您可以在路由器中执行以下操作:
FlowRouter.route('/profile/edit', {
name: 'profile.edit',
triggersEnter: [function(context, redirect) {
if(!Meteor.user()){
console.log('User not logged in. Redirecting...');
redirect('login');
}
}],
action(params) {
mount(FullLayout, {
content: <ProfileEditComposer />
});
}
});
(我在我的Meteor / React应用程序中使用FlowRouter,如果你使用其他类型的路由器,代码会有所不同,但是,我认为应该是相同的想法)
上述代码行阻止未登录的用户编辑个人资料页面并将其重定向到登录页面。通过这种方式,您不需要在Profile-Edit组件或所有其他组件中更改您的代码,当这些组件尝试通过用户对象访问和循环值时可能会产生大量错误 - 在这种情况下未定义