2

所以,我试图做类似以下的事情:

if(Meteor.isServer){
    Meteor.methods({connect_to_api: function(vars){
        // get data from remote API
        return data;
    }});
}

if(Meteor.isClient){
    Template.myTpl.content = function(){
        Meteor.call('connect_to_api', vars, function(err,data){
            Session.set('placeholder', data);
        });
        return Session.get('placeholder');
    };
}

这似乎工作正常,但是,当然,现在在 0.5.9 中中断,因为 Session 对象已从服务器中删除。您现在如何创建一个反应式模板,该模板使用仅服务器(我们不想在客户端上加载的东西)方法调用并从该方法调用中获取数据。您不能将任何 Session 引用放在回调函数中,因为它在服务器上不存在,而且我不知道任何其他可用于此场景的反应式数据源。

我对 Meteor 还很陌生,所以我真的在努力确定最有可能面向未来的最佳实践。显然上面的实现不是这样的。

编辑:澄清一下,这不是我从模板函数返回时的问题。这是服务器上存在 Session 的问题。上面的代码将在服务器上生成以下错误消息:

Exception while invoking method 'connect_to_api' ReferenceError: Session is not defined
at Meteor.methods.connect_to_api (path/to/file.js:#:#)
at _.extend.protocol_handlers.method.exception ... etc etc
4

2 回答 2

1

在回调中设置会话似乎工作正常,请参阅我在 github 上创建的这个项目:https ://github.com/jtblin/meteor_session_test 。在这个例子中,我在一个服务器方法中返回数据,并在回调的会话中设置它。

您的代码有两个问题:

1) 中缺少右括号放置Meteor.methods。代码应该是:

Meteor.methods({
    connect_to_api: function(vars) {
        // get data from remote API
        return data;
    }
});

2) 如上所述,在回调完成之前,即在回调方法有时间设置会话变量之前,您在会话中返回值。我想这就是为什么您还没有在会话变量中看到任何数据的原因。

于 2013-03-18T23:19:35.957 回答
0

我觉得自己像个白痴(不是第一次,也不是最后一次)。感谢 jtblin 向我展示了 Session.set 确实在回调中起作用,我回去检查了 Meteor.method 函数。原来在我使用 Session.get 的代码中隐藏了一个地方,这就是引发错误的原因。一旦我从客户端传递了该值,而不是尝试在方法本身中获取它,世界就一切正常。

哦,您确实可以毫无问题地订购上述物品。

于 2013-03-19T04:35:55.423 回答