Javascript `Meteor.users.findOne(userId)`在客户端中未定义

Javascript `Meteor.users.findOne(userId)`在客户端中未定义,javascript,mongodb,meteor,coffeescript,meteor-helper,Javascript,Mongodb,Meteor,Coffeescript,Meteor Helper,免责声明:我对Meteor是新手 我正在编写一些meteor客户端代码,该代码作为模板助手运行,并使用提供的id加载用户的用户名: Template.message.helpers editedBy: -> return "" unless wasEdited(@) if @edit.by user = Meteor.users.findOne(@edit.by) if user?

免责声明:我对Meteor是新手

我正在编写一些meteor客户端代码,该代码作为模板助手运行,并使用提供的id加载用户的用户名:

 Template.message.helpers
    editedBy: ->
        return "" unless wasEdited(@)
        if @edit.by
            user = Meteor.users.findOne(@edit.by)
            if user?
                user.username
            else
                "?"
        else
            "?"
此代码的问题在于,当消息模板使用帮助程序调用它时:

消息模板的格式为:

<template name="message">
...
    {{editedBy}}
...
</template>

...
{{editedBy}}
...
函数返回
,因为
Meteor
查找返回未定义的。调试并添加一些日志后,我可以验证
@edit.by
id是否是正确的用户id,调用
Meteor.users.findOne(thatId)
是否加载了正确的用户(当我通过chrome javascript控制台执行此操作时)

这是怎么回事?我猜这与数据何时可用有关,但如何修复它呢

提前谢谢

调试信息 在应用程序加载期间

应用加载后

代码对我来说很好。没有更多的背景,很难准确地说出发生了什么。我的猜测是您的助手运行得太快,并且/或者在其上下文更改时没有反应性地重新运行。如果您在助手中使用console.log(@edit.by),它是否显示正确的id?是的,它显示正确的id。如果你感兴趣的话,这是完整的代码。我在代码中做了更多的研究,似乎它使用了for message templates。你写了上面的代码吗?我被你的评论弄糊涂了,“它似乎在使用非反应性渲染'包”。你想用这个软件包吗?您是否已将其添加到项目中?因此,您可以看到,当您的助手被调用时,数据不可用。如果这是反应性的,则数据在可用时会出现。如果这不是一个选项,您必须确保数据可用。您需要查看您的订阅,看看是否可以检查它们是否已准备就绪。或者按照@looshi的建议,在文档中包含用户名(可能是最好的选择)。如果可以避免的话,我会避免在助手中调用服务器方法。如果必须的话,
<template name="message">
...
    {{editedBy}}
...
</template>