【发布时间】:2015-02-20 05:26:51
【问题描述】:
我有一个基本的聊天室应用程序,您可以在其中从调用此方法的主页创建一个房间:
createNewRoom: function (){
//Room containers unique ID for the object
var room = Rooms.insert({
createdAt: new Date()
});
return room;
},
房间的路线是这样的:
Router.route('/rooms/:_id', {
name: 'room',
template: 'chatRoom'
});
我正在尝试设置它,这样您就不能只输入任何随机 ID 并获得一个房间,它必须已经存在。所以我创造了这个铁路由器钩子:
var checkRoomExists = function() {
var room = Rooms.findOne({_id : this.params._id});
if(typeof(room) == "undefined"){
Router.go('home');
}
else {
this.next();
}
}
Router.onBeforeAction(checkRoomExists, {
only : ['room']
});
checkRoomExists 中的room 总是返回 undefined,即使我在其他地方使用相同的 _id 测试完全相同的语句并且房间存在。因此,如果我将链接发送给其他人,即使房间存在,它也会重定向。这是错误的钩子类型还是有更好的方法来完成这个?'
编辑一些附加信息: 这是第一次创建房间的代码:
Template.home.events({
'click #create-room' : function(event){
event.preventDefault();
Meteor.call('createNewRoom', function(error, result){
if (error){
console.log(error);
}else {
Session.set("room_id", result);
Router.go('room', {_id: result});
}
});
}
});
如果我尝试在之后使用完整链接,例如 http://localhost:3000/rooms/eAAHcfwFutRFWHM56,它将不起作用。
【问题讨论】:
-
这假设房间已发布给客户端。是这样吗?
-
现在自动发布仍然安装,而我设置的东西是这样的。我可以进入控制台并执行:
Rooms.findOne({_id: 's3iLE9gmnAcCHNuYM'}),它会返回一个对象,但它在那里不起作用。 -
如果你
console.log(room)你得到了什么?一个东西?在checkRoomExists函数上 -
如果我从主页创建一个房间,它会返回一个对象,但如果我只是使用完整链接并在另一个浏览器中尝试:
localhost:3000/rooms/eAAHcfwFutRFWHM56它会返回 undefined。 -
所以您想避免用户创建新房间(如果它们已经存在)?或在房间存在时访问它们?
标签: meteor iron-router