【问题标题】:Meteor functionality to check for existing user in Meteor.users?Meteor 功能检查 Meteor.users 中的现有用户?
【发布时间】:2015-03-25 20:10:47
【问题描述】:

这段代码看起来如何?相当可靠和高效?有什么办法可以做得更好吗?
编辑:忘了提一下,在用户点击提交以实际创建帐户之前,我正在检查用户是否填写了注册表单。

模板 HTML:

...
<input id="username">
{{#if usernameTaken}}
  <div class="error">Username is taken.</div>
{{/if}}
...

客户:

Template.signupPage.events
  'blur #username': (e) ->
    username = $(e.target).val()

    Meteor.call 'userExists', username, (error, result) ->
      Session.set 'usernameTaken', result.exists

Template.signupPage.helpers
  usernameTaken: ->
    return Session.get('usernameTaken')

服务器:

Meteor.methods
  userExists: (username) ->
    check username, String

    results = Meteor.users.find
      username:
        $regex: "^#{username}$", $options: 'i'

    return { exists: results.count() > 0 }

【问题讨论】:

  • 将限制 1 添加到您的 find(或重写您的代码以改用 findOne)以提高效率。
  • @PeppeL-G 啊!很好的收获,谢谢!

标签: meteor coffeescript


【解决方案1】:

在客户端,这里可能存在令人困惑的交互。在示例中,使用了“myusername”,但没有使用“myusername1”。

  1. 用户输入“myusername”,然后模糊该字段
  2. 客户端调用方法查看“myusername”是否被占用
  3. 用户改变主意,将字段更改为“myusername1”并模糊字段
  4. 客户端调用方法查看“myusername1”是否被占用
  5. 第一个方法调用返回,出现“用户名被占用”
  6. 相当长的时间过去了
  7. 第二个方法调用返回,“用户名被占用”消失

如果用户没有等待“相当长的时间”,他们可能会认为“用户名被占用”是指“myusername1”而不是“myusername”。

我会采取一些措施来解决这个问题:

  • 在方法调用过程中显示“正在检查用户名可用性...”。将其替换为例如当方法返回时,“我的用户名已被占用”或“我的用户名 1 可用”。适当地使用颜色和图标。
  • 如果方法调用正在进行中并且用户在字段中键入了任何内容,即使他们还没有模糊该字段,然后隐藏“检查用户名可用性”。当过时的方法调用返回时,忽略结果。
  • 如果显示“#{username} is (taken|available)”并且用户在该字段中输入任何内容,即使他们尚未模糊该字段,也可以隐藏该文本。

【讨论】:

  • "当过期方法调用返回时,忽略结果。"是否有一个机制来解决这个问题?还是我必须手动设置会话变量来跟踪是否应该忽略回调?
  • 我发现了另一个问题:提交表单并创建新用户时,出现警告“用户名已被占用”,因为显然帐户创建进行得如此之快,并且用户名可用性检查落后于它.所以在我调用我的createSeller 方法之前,我可以做Session.set('creatingUser', true) 并且在blur #username 块中,如果creatingUsertrue,我会立即返回。
  • 简单方法:在检查有效性时禁用用户名输入字段。
【解决方案2】:

它应该可以工作,但是帐户 API 已经内置了重复用户名检测,因为用户名/电子邮件应该是唯一的。

所以你也可以依赖Accounts.createUser (see the doc):

Accounts.createUser({username:..., email:..., password:...}, function(error, result){
  //you will get an error if the username already exists
});

【讨论】:

  • 是的。在这种情况下,我会在用户跳出用户名字段时检查重复的用户名,而不是在实际创建帐户时。
  • 在这种情况下,除了像您一样向数据库发出请求外,我看不到任何其他方法:)
  • @Guillaume 你不能使用这个服务器端。服务器端尚未实现创建用户的回调。
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多