我有一个基本的聊天室应用程序,您可以从主页面创建一个调用此方法的房间:
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']
});
room
中的 checkRoomExists
总是返回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
,则无效。
答案 0 :(得分:0)
我试图避免用户使用某些随机ID localhost:3000 / rooms / asdasd如果有一个ID的房间还没有 存在。
如果你想这样做,你可以按照下一步。
布局配置添加此内容。
Router.configure({
layoutTemplate: 'layout',
loadingTemplate: 'loading',
notFoundTemplate: 'notFound' //add the notFoundTemplate.
});
这个简单的onBeforeAction
。
Router.onBeforeAction('dataNotFound', {only: 'room'});
像这样创建一些示例模板。
<template name="notFound">
<span> Dam this route don't exist <a href="/">go back to home</a>
</template>
选项
我不确定这是否仍然有效,但您可以在最后一个routes.js
js
this.route('notFound', {
path: '*' //this will work like the notFoundTemplate
});
注意强>
如果您没有像这样使用布局模板。
Router.route('/rooms/:_id', {
name: 'room',
notFoundTemplate: 'authorNotFound',
template: 'chatRoom'
});