meteor - iron:router beforeAction login AND data: function? -
i'm using standard iron:router pattern ensuring user authenticated before accessing route:
authenticatedcontroller = routecontroller.extend({ onbeforeaction: function(){ if ( meteor.user() ){ var route = router.current().route.getname(); this.next(); } else this.render('login'); })
this works unparameterized routes example:
router.route("profile",{ name: "profile", controller: 'authenticatedcontroller' });
when try extend pattern parameterized route, example:
router.route('/foo/:id',{ name: 'foo', controller: 'authenticatedcontroller', data: function(){ return mycollection.findone({ _id: this.params.id }); } } });
- it works if user logged in
- i 404 page if user not logged in
it seems beforeaction runs after data function. since mycollection doesn't publish documents until user logged in iron:router decides route doesn't exist.
the time want 404 if collection search doesn't return anything.
i use following pattern works me:
//i create hook authentication var userauthhook = function() { if (meteor.userid()) { this.next(); } else { this.redirect('/login'); } }; //i apply hook routes except login router.onbeforeaction(userauthhook, { except: ['login'] }); //if want 404 error, put in onafteraction callback router.route('/message/:_id', { name: 'message', waiton: function() { return [...]; }, onafteraction: function() { //we wait 'waiton' data ready if(this.ready()) { var message = messages.findone({_id: this.params._id}); if(!message) { //if there no corresponding message render 404 template this.render('error404'); } } } });
i hope work too.
Comments
Post a Comment