【问题标题】:Mongoose and NodeJS: Creating a unique system-generated usernameMongoose 和 NodeJS:创建唯一的系统生成用户名
【发布时间】:2018-03-01 18:39:03
【问题描述】:

我希望能够创建一个系统生成的唯一用户名。然而,mongoose findOne 函数的异步特性让我很吃惊。

我有一个 generateUniqueAccountName 函数,它接受一个提议的用户名,并与 MongoDB 一起检查提议的用户名是否是唯一的。如果它不是唯一的,则会生成一个新名称,直到找到唯一的用户名。

听起来很简单,但 generateUniqueAccountName 甚至在找到唯一名称之前就已退出。我尝试使用 Q(我的实现未在此处显示)但也无法使其工作。

不胜感激。谢谢!

这是 generateUniqueAccountName 函数:

 /**
 * Returns a unique account name based on proposed name
 * @param {String} proposedName
 * @return {Promise}
 */
function generateUniqueAccountName(proposedName) {

  return Account.findOne({accountName: proposedName})
      .then(function(account) {
        if (account != null) {
          console.log('no can do try again: ' + proposedName);
          proposedName += Math.floor((Math.random() * 100) + 1);
          generateUniqueAccountName(proposedName);
        } else {
          console.log('proposed name is unique' + proposedName);
        }
        return proposedName;
      })
      .catch(function(err) {
        console.error(err);
        throw err;
      });
 }

generateUniqueAccountName 是这样调用的:

.then(function(newAccount) {
   // Next generate a unique account name
   console.log('Generating unique account name ...');
   let proposedName = (accounts[i].acctFName + accounts[i].acctLName)
                         .replace(/\s/g, '');

   return generateUniqueAccountName(proposedName.toLowerCase())
            .then(function(accountName) {
               console.log('the unique name is ' + accountName);
               newAccount.accountName = accountName;
               return newAccount;
             })
            .catch(function(err) {
               throw err;
             });
})
.then(saving_part);

这是一个示例输出:

Generating unique account name ...
no can do try again: teylim
no can do try again: michaelalee
no can do try again: joeykwa
the unique name is teylim86
the unique name is michaelalee72
the unique name is joeykwa91
no can do try again: trishalee
the unique name is trishalee7
proposed name: michaelalee72 is unique
proposed name: joeykwa91 is unique
no can do try again: teylim86
no can do try again: trishalee7
proposed name: teylim8641 is unique
proposed name: trishalee734 is unique
Saving account trishalee7

查看 trishalee,如您所见,系统尝试保存用户名 trishalee7,即使日志显示 trishalee7 不是唯一名称

【问题讨论】:

    标签: javascript node.js asynchronous mongoose promise


    【解决方案1】:

    您需要做的就是在generateUniqueAccountName(proposedName) 之前添加return 语句:

    function generateUniqueAccountName(proposedName) {
      return Account
        .findOne({accountName: proposedName})
        .then(function(account) {
          if (account) {
            console.log('no can do try again: ' + proposedName);
            proposedName += Math.floor((Math.random() * 100) + 1);
            return generateUniqueAccountName(proposedName); // <== return statement here
          }
          console.log('proposed name is unique' + proposedName);
          return proposedName;
        })
        .catch(function(err) {
          console.error(err);
          throw err;
        });
    }
    

    【讨论】:

    • 哇哦!这是一个快速的反应,更重要的是,解决了问题!谢谢@alexmac。
    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2016-04-13
    • 2014-07-16
    • 2012-02-01
    相关资源
    最近更新 更多