当使用流星呼叫和流星方法时,MeteorJS无限循环

时间:2016-04-29 05:14:43

标签: javascript meteor

我有一个示例代码:

客户助手:

getUsername: function (userId) {
  Meteor.call("getUsername", userId, function (err, result) {
    if(!err) {
      Session.set("setUsername", result);
    else {
      console.log(err);
    }
  });
  return Session.get("setUsername");
}

服务器

Meteor.methods({
   "getUsername": function (userId) {
      var x = Meteor.users.find({_id: userId}, {fields: {username:1}}).fetch()[0];
      return x.username;
   }
});

此代码的结果是传递给客户端的用户名无限循环。有没有办法停止循环并只传递客户端所需的数据?我相信反应性导致数据无限循环,我不知道如何阻止它。我尝试在服务器中使用"reactive":false查询但不起作用。

2 个答案:

答案 0 :(得分:0)

如果你想在客户端模板中的任何地方访问用户名(这就是为什么你把它放入会话中),我不会在模板帮助器中设置它。我会在启动时设置它并从模板助手中的会话中获取用户名(不调用服务器方法)

如果您只需要在一个模板中使用用户名,那么您希望从模板帮助程序返回其值,请不要将其放入会话中,只需在服务器方法回调中返回它。

答案 1 :(得分:0)

根据您的示例代码,我假设您有一组帖子,并且您正在根据每个帖子的用户ID检索用户名。然后,您应该使用publish composite包来发布相关用户,而不是这样做。

Meteor.publishComposite('getPosts', function (postIds) {
    return [{
        find: function() {
            return Posts.find({ _id: { $in: postIds }});
            // you can also do -> return Posts.find();
            // or -> return Posts.find({ /* or what ever your selector is to get the posts you need*/ });
        },
        children: [{
            find: function(post) {
                return Meteor.users.find({ 
                    id: post.userId //or the correct field in your post document to get user id 
                }, { 
                   fields: { 
                        "profile": 1
                   } 
                });
            }
        }}
    }]
});

通过这种方式,您的出版物将负责发布相关用户以及帖子。您不需要每次都使用方法并调用它们。