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
Oh wow! Ce fut une réponse rapide et, plus important encore, a résolu le problème! Merci @alexmac. – fab