页面重新加载时,Meteor上的会话值重置

时间:2015-07-16 06:24:29

标签: javascript node.js session meteor

页面重新加载时,我定义的值不会保留。

if (Meteor.isClient) {
    Session.setDefault('user_id', null);

    Template.register.events({
        'submit form': function(event){
            var password = getHash(event.target.password.value);
            var name = event.target.name.value;

            console.log(Session.get('user_id')); //always show the default

            var now = new Date();
            password = getHash(password);

            IDS.insert({name: name, online: false, password: password, last_activity: now,last_login: now, created_at: now},function(error,id){
                Session.set('user_id',id);
                //not persisting
            });

            event.target.password.value = '';
            event.target.name.value = '';
        }
    });
}

我做错了什么?

4 个答案:

答案 0 :(得分:2)

正如Marius Darila在评论中解释的那样,流星会话不会持续浏览浏览器刷新。它仅在客户端应用程序中保留。当您在浏览器上刷新页面时,它基本上会重新启动"客户端,将其Session重置为空状态。 (加上您在启动时默认设置的任何变量,例如user_id设置为null

默认情况下,Meteor中的数据只能在mongodb数据库中的应用重新启动时保留。您可以找到许多社区包,为您提供其他数据持久性方法,例如浏览器localStorage的persistent session包,或服务器端文件存储的CollectionFS

答案 1 :(得分:1)

手动刷新页面时,会话不会持续存在。之前所有来自pingo和BraveKenny的回答都是正确的。 但是当Meteor执行热代码重新加载时,它会保留会话数据,因为用户没有询问刷新,而是服务器要求刷新。这是在刷新时持久化Session的唯一用例,但它不应经常发生。

答案 2 :(得分:-1)

需要添加此行:

Tasks = new Mongo.Collection("users");

到服务器部分:

if (Meteor.isServer) {
 // This code only runs on the server
   Tasks = new Mongo.Collection("users");
}

这将保留数据。或者,您可以将其添加到js文件的if(Meteor.isClient)部分之上。

https://www.meteor.com/tutorials/blaze/collections

这是新的,但碰巧也在学习Meteor。让我知道这个是否奏效。谢谢!

答案 3 :(得分:-1)

恕我直言,你没有做错,只是以不正确的方式!为什么不使用帐户包并使用Meteor.userId()代替?它也是反应性的! Btw会话意味着客户端本地存储,而不是在服务器端,每次浏览器重新加载时都是空的。