在没有自动发布的情况下从 ID 获取用户名

Getting a username from ID without autopublish

我刚刚完成了应用程序的草稿,认为是时候删除自动发布和不安全模式了。我开始将我一直在客户端调用的所有杂散更新和插入方法转移到方法。但现在我在 从 ID 返回用户名时遇到问题。

我之前的功能:(一直有效,直到我删除了自动发布)

challenger: function() {
  var postId = Session.get('activePost');
  var post = Posts.findOne(postId);
  if (post.challenger !== null) {
    var challenger = Meteor.users.findOne(post.challenger);
    return challenger.username;
  }
  return false;
}

现在我正在尝试的是:

Template.lobby.helpers({
  challenger: function() {
    var postId = Session.get('activePost');
    var post = Posts.findOne(postId);
    if (post.challenger !== null) {
      var userId = post.challenger;
      Meteor.call('getUsername', userId, function (err, result) {
        if (err) {
          console.log(err);
        }
        return result;
      });
    }
    return false;
  },

使用:

Meteor.methods({
    getUsername: function(userId) {
        var user = Meteor.users.findOne({_id: userId});
        var username = user.username;
        return username;
    },
    ...
})

我试过阻止代码,只在定义后返回值,并且 console.logging 在回调中(向控制台返回正确的用户名,但视图保持不变)

希望有人能发现我犯的明显错误,因为我现在已经尝试了 3 个小时,我无法弄清楚为什么该值会在控制台中返回但不会返回到模板中。

助手需要同步 运行 并且不应该有任何副作用。您应该确保发布 route/template 所需的用户,而不是调用方法来检索用户。例如,您的路由器可以等待活动 post 和 post 的挑战者的订阅。一旦客户有了必要的文件,您就可以恢复到原来的代码。