铁路由器在路由运行之前检查文件是否存在

时间:2015-02-19 20:42:16

标签: meteor iron-router

我有一个基本的聊天室应用程序,您可以从主页面创建一个调用此方法的房间:

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,则无效。

1 个答案:

答案 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'
});