2017-09-20 1 views
0

Je souhaite être en mesure de créer un nom d'utilisateur généré par le système qui soit unique. Cependant, la nature asynchrone de la fonction mongoose findOne me fait trébucher.Mongoose et NodeJS: création d'un nom d'utilisateur unique généré par le système

J'ai une fonction generateUniqueAccountName qui accepte un nom d'utilisateur proposé et vérifie avec MongoDB si le nom d'utilisateur proposé est unique. Si ce n'est pas unique, un nouveau nom est généré jusqu'à ce qu'un nom d'utilisateur unique soit trouvé.

Semble assez simple mais generateUniqueAccountName est quitté même avant qu'un nom unique ne soit trouvé. J'ai essayé d'utiliser Q (mon implémentation n'est pas montrée ici) mais je ne pouvais pas le faire fonctionner non plus.

J'apprécierais toute aide. Merci!

Ceci est la fonction 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 est appelé comme ceci:

.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); 

Ceci est un exemple de sortie:

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 

En regardant trishalee, comme vous pouvez voir, le système tente de sauvegarder le nom d'utilisateur trishalee7 même si le journal a afficher n trishalee7 est pas un nom unique

Répondre

1

Tout ce que vous devez faire est d'ajouter la déclaration return avant generateUniqueAccountName(proposedName):

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; 
    }); 
} 
+0

Oh wow! Ce fut une réponse rapide et, plus important encore, a résolu le problème! Merci @alexmac. – fab